2012-06-20 2 views
0

아무도 내 비동기 작업이 때때로 이렇게 실패하는 이유를 말해 줄 수 있습니까? 3 개의 장치에서 테스트했지만이 오류가 발생하지 않았습니다. 나는 GOOGLEPLAY에 업로드하고 200 다운로드 후이 일에 3 오류 보고서는 난 몰라, 거기에 아직 어떤 오류의 주요 원천 ... 내가 볼

java.lang.RuntimeException: An error occured while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:200) 
    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
    at java.lang.Thread.run(Thread.java:1019) 
    Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
    at android.view.ViewRoot.checkThread(ViewRoot.java:3225) 
    at android.view.ViewRoot.invalidateChild(ViewRoot.java:760) 
    at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:786) 
    at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511) 
    at android.view.View.invalidate(View.java:5498) 
    at android.view.View.setBackgroundDrawable(View.java:7845) 
    at android.view.View.setBackgroundResource(View.java:7754) 
    at com.KeySoft.NewPilates.Activities.LatestActivity.parseXml(LatestActivity.java:1106) 
    at com.KeySoft.NewPilates.Activities.LatestActivity.access$1(LatestActivity.java:964) 
    at com.KeySoft.NewPilates.Activities.LatestActivity$DownloadXml.doInBackground(LatestActivity.java:354) 
    at com.KeySoft.NewPilates.Activities.LatestActivity$DownloadXml.doInBackground(LatestActivity.java:1) 
    at android.os.AsyncTask$2.call(AsyncTask.java:185) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 

나의 AsyncTaks의 * doInBackground * 기능이 있습니다 setBackgroundDrawablesetBacktroundResource func 않는 그 verry 잘 ... 어떤 아이디어?

E D I T : 체크 대답에서

있어 솔루션 :

내가 doInBackround에서 내부의 전망을 수정하기 위해 새의 Runnable를 사용해야합니다. 당신은 UI 관련 작업을 수행하려고

runOnUiThread(new Runnable() { 
      public void run() { 

       LinearLayout hatterLayout = (LinearLayout)findViewById(R.id.hatterLayout); 
       hatterLayout.setBackgroundResource(R.drawable.nonet); 

      } 
+0

doInBackgroung이 끝나기 전에 사용자가 액티비티를 종료하면 어떻게됩니까? Drawable을 설정하려고합니까? – Jonas

+0

글쎄, 나는 onFinish()에서 AsyncTasks가 어떻게되는지 실제로 알지 못한다; –

+0

어떤 답을 확인하고 있습니까? 아직 받아 들여지지 않은 대답은 없습니다. –

답변

3

는 백그라운드 스레드에서 (View의 조작). setBackgroundDrawable()setBackgroundResource()View 클래스의 메서드이며 ASyncTask이 아닙니다.

이 작업을 수행 할 수 없습니다. 일반적인 경우 백그라운드 스레드에서 UI 업데이트를 유도하는 방법으로 runOnUiThread()을 살펴보십시오.

그러나 특히 ASyncTask의 경우 사용자 인터페이스 스레드에서 작업하기에 편리한 후크가 있습니다. onProgressUpdate()onPostExecute()을 무시하고 UI 작업을해야한다고 생각해야합니다.

1

UIThread에서 setBackgroundDrawable을 수행해야합니다.

그래서 asynctask의 onPostExecute 메소드에서 setBackgroundDrawable을 수행하십시오.

관련 문제