2013-10-04 1 views
2

AsyncTask 모습을 계속합니다. 계속 진행하기 전에 onProgressUpdate가 완료 될 때까지 기다리는 방법은 무엇입니까?대기 publishProgress 마감 전에 excute에 doInBackground AsyncTask를에게 같은 안드로이드

업데이트 다음 GetData의() 메소드에서
, 나는 doInBackground하고 뷰에서 다른 정보에서 작동하지 않을 수 있습니다 사용자의 현재 위치를 얻기 위해 노력했다. 작업 1이 매우 오랜 시간이 걸리고 사용자의 현재 위치가 변경 될 수 있으므로이 작업을 수행해야합니다. 가장 정확한 사용자 위치가 필요합니다.

+0

기다리고 알림을 사용하면 그게 무엇인지 알 수 있습니다. – njzk2

답변

2

, 당신은 doInBackground 및 publishProgress()를 사용하는 방법을 문의 onProgressUpdate 의 말에 doInBackgrnd

`if(!_publishFinish) 
{Thread.Sleep(200);}` 

에 바쁜 대기를 할 진전을 게시 전화 나는 아직도 뭔가 잘못이지만, 메소드 코드 getData()이 필요합니다.

doInBackground 방법은 이벤트 스레드가 아닌 다른 스레드에서 실행해야 할 몇 가지 작업을 수행하는 데 사용되어야하고, publishProgress 방법, 당신은 이벤트 스레드와 함께 작동 작업을 실행해야합니다. 그러므로 getData()이 이벤트 스레드와 아무런 관련이 없다면 코드 doInBackground에 코드를 작성하십시오. 요구 사항은 단지 이러한 방법으로 현재를 모두 사용하는 경우

그러나, 당신은 아래 등과 같은 동기화 블록을 추가 할 수 있습니다

private class MyTask extends AsyncTask<String, Void, List<Data>> { 
    private volatile UserData userData; 
    protected List<Data> doInBackground(String... params) { 

    synchronize(userData) 
    { 
     // do some job 1 
     publishProgress(); 
     // wait until the progress finish to update variable. 
     if(userData!= null){ 
     //do some job 2 
     } 

     //do some job 3 
    } 
    } 

    protected void onProgressUpdate(Void... values) { 
     // try to ask user and collect information 
     synchronize(userData) 
     { 
      userData= getData(); 
     } 
    } 

} 
+0

내 질문을 업데이트했습니다. getData() 메소드에서 위치 데이터를 가져와야합니다. – R4j

+0

jeet 당신은 또한 휘발성의 사용을 설명하고 그것을 동기화 할 수 있습니까? 휘발성 객체는 동시에 여러 스레드에서 변경할 수 있다는 것을 알고 있습니다. 동기화 (잠금)는 단일 스레드가 스레드에서 작동 할 수 있음을 의미합니다. – Nepster

0

플래그 _publishFinished = false; 그때 나는 생각

_publisFinish = true; 
0
private class MyTask extends AsyncTask<String, Void, List<Data>>{ 


     protected void onPreExecute() { 
      // Showing progress dialog before sending http request 
      pDialog = new ProgressDialog(YourActivity.this); 
      pDialog.setMessage("Please wait.."); 
      pDialog.setIndeterminate(true); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 
    private volatile UserData userData; 
    protected List<Data> doInBackground(String... params) { 
     // do some job 1 
     publishProgress(); 
     // wait until the progress finish to update variable. 
     if(userData!= null){ 
     //do some job 2 
     } 

     //do some job 3 

    } 

    protected void onProgressUpdate(Void... values) { 
     // try to ask user and collect information 
     userData= getData(); 
    } 
    protected void onPostExecute(Void unused) { 
      // closing progress dialog 
      pDialog.dismiss(); 
     } 

} 

pDialog가 진행 대화 상자입니다. 다음과 같이 활동의 ​​어느 곳에서나 초기화하십시오 :

ProgressDialog pDialog; 

이것은 도움이 될 것입니다.

관련 문제