2017-06-11 22 views
0

ので、私はAndroidのWebサービスを学ぶことを試みていると私は私の コードを実行するとき、私は、この例外は、することができます取得:どうすればこのCalledFromWrongThreadExceptionを修正できますか?

FATAL EXCEPTION: Thread-4 
                         Process: com.example.abdallahmurad.webservices_test, PID: 7328 
                         android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
                          at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6855) 
                          at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1040) 
                          at android.view.View.requestLayout(View.java:19654) 
                          at android.view.View.requestLayout(View.java:19654) 
                          at android.view.View.requestLayout(View.java:19654) 
                          at android.view.View.requestLayout(View.java:19654) 
                          at android.view.View.requestLayout(View.java:19654) 
                          at android.view.View.requestLayout(View.java:19654) 
                          at android.view.View.requestLayout(View.java:19654) 
                          at android.support.constraint.ConstraintLayout.requestLayout(ConstraintLayout.java:884) 
                          at android.view.View.requestLayout(View.java:19654) 
                          at android.widget.TextView.checkForRelayout(TextView.java:7363) 
                          at android.widget.TextView.setText(TextView.java:4475) 
                          at android.widget.TextView.setText(TextView.java:4332) 
                          at android.widget.TextView.setText(TextView.java:4307) 
                          at com.example.abdallahmurad.webservices_test.MainActivity$1$1.run(MainActivity.java:52) 
                          at java.lang.Thread.run(Thread.java:761) 

そして、ここでMainActivityコード:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    ButterKnife.bind(this); 


    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
      Runnable runnable = new Runnable() { 
       @Override 
       public void run() { 
        try { 
         URL dataPath = new URL("http://abdallahmurad.hostkda.com/myfirst_echo_test.php"); 
         HttpURLConnection myFirstConnection = (HttpURLConnection) dataPath.openConnection(); 
         InputStreamReader inputStreamReader = new InputStreamReader(myFirstConnection.getInputStream()); 
         BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
         String data = bufferedReader.readLine(); 
         textView.setText(data); 
         System.out.println(data); 
         Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      }; 
      Thread thread = new Thread(runnable); 
      thread.start(); 
     } 
    }); 
} 

myfirst_echo_test.phpは1つのエコーを持つ簡単なPHPファイルです ""

私の質問はこの例外とは何ですか?どのように修正できますか?あなたは非UIスレッドでUI要素のテキストを設定しようとしているため

答えて

0

textView.setText(data);のみメインスレッドからUIを更新することができますが、この問題が発生します。あなたはRunOnUiThreadを呼び出すことにより、コードを変更し、UIスレッドでそれを行う必要があります:あなたは(あなたのRunnableのような)非UIスレッド内の任意のUI要素(だけではなくのTextView)を操作しようとした場合

runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         textView.setText(data); 
         Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show(); 
        } 
       }); 

これはオールウェイズ起こります。 Runnableの代わりにAsyncTaskを試して、操作を実行してonPostExecute()のUI要素を操作することもできます。

new AsyncTask<Void,Void,Void>(){ 

      String data=""; 
        @Override 
        protected Void doInBackground(Void... params) { 

         URL dataPath = new URL("http://abdallahmurad.hostkda.com/myfirst_echo_test.php"); 
        HttpURLConnection myFirstConnection = (HttpURLConnection) dataPath.openConnection(); 
        InputStreamReader inputStreamReader = new InputStreamReader(myFirstConnection.getInputStream()); 
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
        data = bufferedReader.readLine(); 

         return null; 
        } 

        @Override 
        protected void onPreExecute() { 
         super.onPreExecute(); 
        } 

        @Override 
        protected void onPostExecute(Void aVoid) { 
         super.onPostExecute(aVoid); 
          textView.setText(data); 
          Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show(); 
        } 
       }.execute(); 

もトーストがOnPostExecuteで呼び出さなければならないことに注意してください。

+0

私はこのソリューションをEventBusのようなものと組み合わせます。あなたの活動が死んでいる場合は、onPostExecuteに問題があります。 –

1

あなたは

MainActivity.this.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
    textView.setText(data); 
     } 
    }); 
関連する問題