2013-07-26 3 views
0

나는 비동기 노동자비동기 노동자 충돌 앱

private class Renderer extends AsyncTask<Void, Void, Void>{ 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 

       Toast.makeText(getApplicationContext(), "works... ", Toast.LENGTH_LONG).show(); 
      return null; 
     } 





     protected void onProgressUpdate(Integer... progress) { 

     } 

     protected void onPostExecute(Long result) { 

     } 
    } 

의 메인 클래스 내에서 다음 코드를 작성한 그러나 호출이 어떤 사람 잘못 무슨 일이 일어나고 있는지 말해 줄 수 응용 프로그램

public void render(View v) 
    { 
     new Renderer().execute(); 
    } 

충돌?

답변

1

ToastdoInBackground에 입력하면 Can't create handler inside thread that has not called Looper.prepare()이됩니다.

이 단계에서 테스트하는 경우 (코드가 암시하는 것처럼 보임) 대신 지금은 일부 로그 출력을 작성하는 것을 고려하십시오. How to raise a toast in AsyncTask, I am prompted to used the Looper

+0

을 발생하지 아무것도 당신의'AsyncTask' 잘못 – techno

+0

발생하지 . 모든 메소드 앞에'@ Override'를 넣고 eclipse가 지시하는 것을 따르십시오. 메소드 서명이'AsyncTask' 선언에 따라'protected void onPostExecute (Void result) {'이어야하므로'onPostExecute()'는 전혀 호출되지 않습니다. ** 짧은 답변 ** : onPostExecute를'(Void result)'로 변경하면 안됩니다'(Long result)'로하면 효과가 있습니다 –

0

토스트를 doInbackground에 표시하고 있습니다. 불가능합니다. onPostExecute

protected void onPostExecute(Long result) { 
      Toast.makeText(getApplicationContext(), "works... ", Toast.LENGTH_LONG).show(); 
    } 

doInbackground에서이를 수행은 백그라운드 스레드에서 호출됩니다. ui 스레드에서 ui를 업데이트해야합니다. 토스트는 onProgressUpdate에 표시 할 수 있습니다.

http://developer.android.com/reference/android/os/AsyncTask.html

에서

자세한 정보는 4 단계 섹션 아래 항목을 확인합니다.

+0

좋아하지만, 충돌하지 않는 Onpostexecute.App에서 토스트를 넣어 후에도 작동하지 않습니다하지만 아무것도 충돌하지 않는 Onpostexecute.App에서 토스트를 넣어 후에도 작동하지 않습니다 – techno

0

당신은 백그라운드 스레드에서 UI 스레드에 액세스 할 수 없습니다 :

은 또한 당신의 Toast 중 하나 onPreExecute 또는 onPostExecute

더 많은 정보를 넣어.

0

AsyncTaskThreadsHandlers 주위의 도우미입니다. 백그라운드 작업을 수행하고 UI를 정기적으로 업데이트하는 데 도움이됩니다.

따라서, 다른 ThreadsAsyncTask 실행의 방법 : 배경 스레드에서 doInBackground 실행 onProgressUpdate과 UI ThreadonPostExecute 실행됩니다.

이제는 UI Thread (= 메인 Thread)에서만 UI를 수정할 수 있습니다. 이것이 코드가 충돌로 이어지는 이유입니다. ToastonPostExecute으로 옮기면 문제가 해결됩니다.

0
runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
        Toast.makeText(getApplicationContext(), "works... ", Toast.LENGTH_LONG).show(); 
        } 
       });` 

주 스레드에서 모든 작업을 수행하십시오.