2014-12-06 160 views
0

我有一个viewpager与一些actiontabs每个操作选项卡有自己的布局。在其中一个布局中,我有一个按钮,当点击一个AsyncTask改变背景 颜色应执行如下所示。错误执行异步任务

在运行时,我从logcat收到下面的错误。

请看看logcat的错误,并请让我知道我在代码中缺少的东西。

代码

class AsyncColor extends AsyncTask<String, Integer, String> { 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     for (int i = 0; i < params.length; i++){ 
      rl_3.setBackgroundColor(Color.parseColor(params[i])); 
     } 
     return "done"; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     btn_asynch.setText(result); 
    } 
} 

@Override 
public void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 

    btn_asynch.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      new AsynchColor().execute(asynchBLUE, asynchGREEN, asynchRED, asynchBLUE1, asynchGREEN1, asynchRED1); 
     } 
    }); 

logcat的

12-06 13:13:15.049: E/AndroidRuntime(5591): FATAL EXCEPTION: AsyncTask #1 
12-06 13:13:15.049: E/AndroidRuntime(5591): java.lang.RuntimeException: An error occured while executing doInBackground() 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at android.os.AsyncTask$3.done(AsyncTask.java:300) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at java.lang.Thread.run(Thread.java:841) 
12-06 13:13:15.049: E/AndroidRuntime(5591): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6832) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1053) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at android.view.ViewGroup.invalidateChild(ViewGroup.java:4518) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at android.view.View.invalidate(View.java:11687) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at android.view.View.setBackgroundDrawable(View.java:16248) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at android.view.View.setBackground(View.java:16139) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at android.view.View.setBackgroundColor(View.java:16101) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at com.example.viewpagerwithactiontabstest00.Aufgabe_7$AsynchColor.doInBackground(Aufgabe_7.java:72) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at com.example.viewpagerwithactiontabstest00.Aufgabe_7$AsynchColor.doInBackground(Aufgabe_7.java:1) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
12-06 13:13:15.049: E/AndroidRuntime(5591):  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
+0

所有UI更新必须位于onPostExecute,onPreExecute,onProgressUpdate。你不能在onBackground更新UI,请移动'rl_3.setBackgroundColor(Color.parseColor(params [i]));'以上功能 – 2014-12-06 12:19:54

+0

你不能在doInBackground方法中进行UI更新 – Amy 2014-12-06 12:31:48

回答

1

你不能触摸UI线程元素在doInBackground

@Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     for (int i = 0; i < params.length; i++){ 
      publishProgress(params[i]); 
     } 
     return "done"; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 
     rl_3.setBackgroundColor(Color.parseColor(values[i])); 
    } 
0

您正试图改变一个线程的视图w ^这不是UIThread。

您需要将您的

for (int i = 0; i < params.length; i++){ 
     rl_3.setBackgroundColor(Color.parseColor(params[i])); 
    } 

onPreExecute(runs onUIThread)onPostExecute(Runs on Ui Thread)onProgressUpdate不同的逻辑(你可以用publishProgress();打电话。但是如果你的doInBackground是没有这种空的。我只会建议你清除此的AsyncTask和移动

for (int i = 0; i < params.length; i++){ 
     rl_3.setBackgroundColor(Color.parseColor(params[i])); 
    } 

到您的活动的新方法。我不能说,如果它是更好的由于性能做这样一个小的凝固酶原直接在UIThread上,或者多次调用onProgressUpdate。我觉得差必须非常小,而你节省大量的代码行,这使得你的代码更好看..

了解更多的AsyncTask:http://developer.android.com/reference/android/os/AsyncTask.html

而且关于无痛线程教程:http://android-developers.blogspot.co.at/2009/05/painless-threading.html