2012-04-16 92 views
0

我正在使用類擴展Asynctask來下載數據表單webservice。爲了防止數據丟失和請求超時,我試圖重複這個asynctask並每隔100行讀取一次數據。但循環錯誤,從不運行任務:如何在完成後重複AsyncTask

功能重複任務:

public void executeCustomer(String vSpvId){ 
    String vURL; 
    int vloop = 1; 

    while(notStop){ 
     vURL = Routines.URL_CUSTOMER + "?vloop=" + String.ValueOf(vLoop) + "&vsupvid=" + vSpvId; 
     Log.d(TAG, vURL); 
     vCustomerAsyncTask = new CustomerAsyncTask(); 
     vCustomerAsyncTask.execute(vURL); 
    vloop++; 
    } 
} 

任務,下載數據:

private class CustomerAsyncTask extends AsyncTask<String, Void, String>{ 

    @Override 
    protected void onPreExecute() { 
     showProgressBar(Routines.WAIT); 
    } 

    @Override 
    protected String doInBackground(String... vURL) { 
     String vASPXText = Routines.getASPXText(vURL[0]); 
     return vASPXText; 
    } 

    @Override 
    protected void onPostExecute(String vASPXResult) { 
     super.onPostExecute(vASPXResult); 

     try{ 
      if((vASPXResult.length() == 0)||(vASPXResult.contains("masalah"))){ 
       vDialogBox.dismiss(); 
       Toast.makeText(getApplicationContext(), Routines.DATABASE_ERROR, Toast.LENGTH_SHORT).show(); 
       throw new NullPointerException(Routines.DATABASE_ERROR);     
      } 
     }catch(NullPointerException e){ 
      e.printStackTrace(); 
      Log.w(TAG, Routines.DATABASE_ERROR); 
      vDialogBox.dismiss(); 
      showDialogBox(Routines.WARNING, Routines.DATABASE_ERROR); 
      return; 
     } 
     vDialogBox.dismiss(); 

     notStop = parsingCustomer(vASPXResult); 
    } 
} 

函數來分析數據:

private boolean parsingCustomer(String vASPXResult){  
    try{ 
     Log.d(TAG, vASPXResult); 
     if(vASPXResult.indexOf("[email protected]`") == 0){ 
      // function to parse data 
      // return true to read next data from webservice 
      return = true; 
     }else if (vASPXResult.indexOf("[email protected]`") == 0){ 
      // function to parse data 
      // return false to stop read data from webservice 
      return = false; 
     } 
    }catch (StringIndexOutOfBoundsException e) { 
     e.printStackTrace(); 
     Log.e(TAG, Routines.DATABASE_ERROR); 
     showDialogBox(Routines.WARNING, Routines.DATABASE_ERROR); 
    } 
} 

我的問題是如何重複的asynctask,當它完成下載第一個數據,然後重複自我做下一個網址參數。當我檢查logcat時,循環總是運行,但任務從未完成。所以,如何讓它可以運行重複的asynctask。

+0

如果我正確地讀你,就沒有必要使用例如10的AsyncTask下載10個網址sequently。就你而言,只需構建並準備10個URL並將URL列表傳遞到一個AsyncTask中,然後在doInBackground()方法中,正確地實現for循環以按順序迭代和處理URL。 – yorkw 2012-04-16 10:55:25

回答

0

保持靜態計數器和調用的AsyncTask

這樣

if(counter<desiredCount){ 


vURL = Routines.URL_CUSTOMER + "?vloop=" + String.ValueOf(vLoop) + "&vsupvid=" + vSpvId; 
     Log.d(TAG, vURL); 
     vCustomerAsyncTask = new CustomerAsyncTask(); 
     vCustomerAsyncTask.execute(vURL); 
} 
中的AsyncTask的 post excecute

..目前什麼你做!因爲你啓動一個的AsyncTask先於其他一個甚至完成可能無法工作..

+0

謝謝你的想法。 – 2012-04-16 09:38:42

+0

@PaijoRX ..做到了.. ..? – ngesh 2012-04-16 09:39:27

+0

但我不知道有多少行,所以我無法初始化靜態計數器,我認爲靜態計數器無法使用。 – 2012-04-16 09:39:47

0

我們無法執行兩次或兩次以上的AsyncTask。因此,每次我們只在本地創建實例。像new MyTask().execute(url).避免全局聲明異步任務實例。另一件事我們可以使用Loader類多次執行異步任務,該類也具有向後兼容性。

+0

我試圖讀取像這樣的數據: – 2012-04-16 09:44:13

0

使用再次調用它像一個倒退的形式`name.excuteTask()」

+0

終於,我找到了解決方案... 只需要在新的參數中再次調用任務,直到停止條件。像遞歸函數... – 2012-04-17 00:38:57

+0

@PaijoRX:酷!那是什麼。你說對了。但要確保你的停車條件不會太長。並檢查它是否影響您的應用程序的儀器處理程序。 – 2012-04-17 05:19:47