2017-05-08 99 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 

如何解决此问题?我需要根据从其他线程触发的事件更新GUI(Asynctask

回答

1

当您使用AsyncTask时,它将按顺序执行4个步骤。
1. onPreExecute()
2. doInBackground()
3. onProgressUpdate()
4. onPostExecute()

在这些4种方法,只doInBackground()上后台线程运行时,3和其他运行在主UI线程上。您应该在这3种方法中更新您的UI元素(即禁用Button),这取决于您的应用程序行为。
您不允许更新doInBackground()上的UI。