2017-05-08 3 views
0

作成したスレッドとは異なるスレッドから無効にするボタンビューがあります。私は、次のエラーを取得しています:ここでAndroid:他のスレッドからトリガされたイベントに基づいてGUIを更新する

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
Process: org.pcgod.mumbleclient, PID: 21302 
java.lang.RuntimeException: An error occurred while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:309) 
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
at java.lang.Thread.run(Thread.java:818) 
Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:8129) 
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1258) 
at android.view.ViewGroup.invalidateChild(ViewGroup.java:5430) 
at android.view.View.invalidateInternal(View.java:13927) 
at android.view.View.invalidate(View.java:13863) 
at android.view.View.invalidateDrawable(View.java:18097) 
at android.widget.TextView.invalidateDrawable(TextView.java:6177) 
at android.graphics.drawable.DrawableContainer.invalidateDrawable(DrawableContainer.java:377) 
at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:844) 
at android.graphics.drawable.Drawable.setVisible(Drawable.java:1575) 
at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:448) 
at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:104) 
at android.graphics.drawable.Drawable.setState(Drawable.java:1413) 
at android.view.View.drawableStateChanged(View.java:18264) 
at android.widget.TextView.drawableStateChanged(TextView.java:4505) 
at android.view.View.refreshDrawableState(View.java:18328) 
at android.view.View.setEnabled(View.java:8018) 
at android.widget.TextView.setEnabled(TextView.java:1895) 
at org.pcgod.mumbleclient.Matar.TcpClient.readMessageFromServer(TcpClient.java:103) 
at org.pcgod.mumbleclient.Matar.home$requestsQueueConnectTask.doInBackground(home.java:297) 
at org.pcgod.mumbleclient.Matar.home$requestsQueueConnectTask.doInBackground(home.java:276) 
at android.os.AsyncTask$2.call(AsyncTask.java:295) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
at java.lang.Thread.run(Thread.java:818)  

は私のコードです:

requestBTN = (Button) findViewById(R.id.requestBTN); 
new requestsQueueConnectTask().execute(""); //handle requests queueing 

この問題を回避する方法は?私は他のスレッド(Asynctask)からトリガされたイベントに基づいてGUIを更新する必要があります

答えて

1

AsyncTaskを使用すると、順番に4つのステップを経ます。
1. onPreExecute()
2 doInBackground()
3 onProgressUpdate()
4 onPostExecute()これらの4つの方法では

、唯一doInBackground()は、3人の実行、バックグラウンドスレッド上で実行さメインのUIスレッドにあります。アプリの動作に応じて3つの方法でUI要素(ボタンを無効にする)を更新する必要があります。
UIを更新することはできませんdoInBackground()

関連する問題