2014-12-06 13 views
0

viewpageractiontabs이 각각 있습니다. 각 작업 탭에는 자체 레이아웃이 있습니다. 레이아웃 중 하나에서 배경을 변경하는 AsyncTask을 클릭하면 아래 그림과 같이 색상이 실행되어야하는 버튼이 있습니다.asynchTask를 실행할 때 오류가 발생했습니다.

런타임시 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); 
     } 
    }); 

로그 캣 :

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]));'를 함수 위로 이동하십시오. –

+0

doInBackground 메소드에서 UI 업데이트를 할 수 없습니다 – Amy

답변

1

당신은 doInBackground에서 터치 UI 스레드 요소를 기울인다

당신은 스레드에보기를 변경하려고
@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 hich는 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가없이 비어있는 경우 할 수 있습니다. 간단히 말해서 나는 당신을 추천 할 것입니다 이동이 필요합니다 이 같은 작은 proce을 할 성능 개선으로 인한 경우이 AsyncTask를을 취소하고 활동의 새로운 방법으로

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

이동합니다. 나는 말할 수 없다 UIThread에 직접 호출하거나 onProgressUpdate를 여러 번 호출하십시오. http://developer.android.com/reference/android/os/AsyncTask.html

그리고 고통 스레딩에 대한 자습서 :

AsyncTask를 대해 자세히 알아 .. 나는 차이가 정말 작은 생각합니다, 당신은 당신이 찾고 더 나은 코드를 만드는 코드 라인을 많이 저장하는 http://android-developers.blogspot.co.at/2009/05/painless-threading.html

관련 문제