2014-12-06 6 views
0

У меня есть viewpager с некоторыми actiontabs каждая вкладка действий имеет свой собственный макет. в одном из макетов у меня есть кнопка, которая при нажатии AsyncTask, которая меняет фон цвет должен быть выполнен, как показано ниже.Ошибка при выполнении asynchTask

Во время выполнения я получаю следующие ошибки из логарифма.

Пожалуйста, взгляните на ошибки 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

все обновления пользовательского интерфейса должны быть в onPostExecute, onPreExecute, onProgressUpdate. вы не можете обновить интерфейс в onBackground, переместите 'rl_3.setBackgroundColor (Color.parseColor (params [i]));' to above functions –

+0

Вы не можете обновлять пользовательский интерфейс в doInBackground – Amy

ответ

1

Вы наклоняете сенсорные элементы пользовательского интерфейса резьбы В 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

Вы пытаетесь изменить вид на тему вес это не 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])); 
    } 

в новый метод в вашей деятельности. Я не могу сказать, что лучше из-за производительности, чтобы сделать такой небольшой проц ss непосредственно на UIThread или вызывать onProgressUpdate несколько раз. Я думаю, что разница должна быть очень небольшой, и вы экономите много кодовых линий, что делает ваш код лучше выглядит ..

Подробнее о AsyncTask: http://developer.android.com/reference/android/os/AsyncTask.html

И учебник о безболезненной Threading: http://android-developers.blogspot.co.at/2009/05/painless-threading.html

Смежные вопросы