2013-02-07 43 views
2

我正在從服務器上下載文件,然後解析並在本地數據庫中插入,而此操作使用進度條顯示操作的進度。由於文件非常大,需要2-4分鐘進行解析,因爲這樣我得到了ANR進度條和進度條在下載完成後沒有得到更新,它只顯示50%的進度。如何避免這種ANR?我附上我的代碼如下...在Android的AsyncTask中長時間運行XML解析時如何避免ANR?

@Override 
    protected void onPreExecute() 
    { 
      flag = false; 
      progressCount = 0; 
      ProgressDialog progressBar = DdownoadProgressBar(context, 
      progressCount); 
      progressBar.show(); 

    } 

    @Override 
    protected Integer doInBackground(String... urls) { 
     checkNetworkConnection(); 

     if (connectionFlag) { 
      downloadFile1(); 
      progressCount = 1; 
      publishProgress(progressCount); 

      downloadFile2(); 
      progressCount = 2; 
      publishProgress(progressCount); 

      downloadFile3(); 
      progressCount = 3; 
      publishProgress(progressCount); 

      downloadFile4(); 
      progressCount = 4; 
      publishProgress(progressCount); 

      downloadFile5(); 
      progressCount = 5; 
      publishProgress(progressCount); 

      downloadFile6(); 
      progressCount = 6; 
      publishProgress(progressCount); 

      downloadflag = true; 
     } 
     return null; 
    } 


    @Override 
    protected void onProgressUpdate(Integer... progress) 
    { 
     Log.v(TAG, "In progressUpdate..."); 

     progressBar.setProgress(progressCount); 

    } 

    @Override 
    protected void onPostExecute(Integer progress) { 
     if (downloadflag) { 
      try { 

       Log.v(TAG, "Inside onPostExecute...."); 

       parseFile1(); 
       progressCount=7; 
       publishProgress(progressCount); 

       parseFile2(); 
       progressCount=8; 
       publishProgress(progressCount); 

       parseFile3(); 
       progressCount=9; 
       publishProgress(progressCount); 

       parseFile4(); 
       progressCount=10; 
       publishProgress(progressCount); 

       parseFile5(); 
       progressCount=11; 
       publishProgress(progressCount); 

       parseFile6(); 
       progressCount=12; 
       publishProgress(progressCount); 

       progressBar.dismiss(); 
       Toast.makeText(SynchronizeData.this,"Data is successfully downloaded from server.......", Toast.LENGTH_LONG).show(); 

      } catch (Exception e) { 

       e.printStackTrace(); 
      } 
     } else { 

      progressBar.dismiss(); 

      Toast.makeText(
        getApplicationContext(), 
        "File is not downloaded....Error in network connection...........",Toast.LENGTH_LONG).show(); 
      Log.v(TAG, "File is not downloaded..............."); 

     } 
    } 
+0

不解析onPostExecute? – njzk2

+0

我想解析並插入數據庫爲此目的,我必須通過上下文,因此我不能在背景中執行它.... – Narendra

回答

1

將解析邏輯移入doInBackground方法。沒有理由在後臺線程上進行Web調用並在UI線程上解析。

+0

因爲我一旦我從中獲取解析數據插入本地數據庫解析每個元素,我需要傳遞上下文到我的處理程序,因此我不能在doInBackground()方法中編寫我的解析邏輯... – Narendra

1

正如Rich所說:解析doInBackground中的文件。

其他選項是根據需要在onPostExecute中運行儘可能多的異步任務。

但是,如果文件很大,你應該考慮使用線程/隊列工作者模式/服務!

+0

正是我想要使用此模式工作線程執行解析任務,並使可能UI線程知道這個任務完成並setProgress的進度條,但我不知道如何做到這一點,因爲我在這裏是新的,我搜索,但沒有得到任何東西......如果可能告訴我如何執行此操作。 – Narendra

+0

謝謝我得到的解決方案我做了doInBackground()..... – Narendra

1

是的,你在做什麼非UI任務必須在doInBackground()方法中完成。 如果您將在主線程中工作的AsyncTask方法中執行長時間運行的任務,那麼它將爲您提供ANR。

+0

因爲我解析數據插入本地數據庫一旦我解析每個元素得到我需要傳遞上下文到我的處理程序,因此我不能寫我在doInBackground()方法中的解析邏輯... – Narendra

+0

爲什麼你不在databean中存儲解析的數據? 解析後,您可以爲您的處理程序提供上下文,並一次性將所有數據存儲在數據庫中。更多的時間讓他們插入分貝。 所以,首先將所有數據進行分析,然後存儲在數據庫中。 – DcodeChef

+0

我這樣做之前試圖將分析數據存儲在數組列表中,然後一次性插入數據庫中,因爲文件太大了我正在出內存錯誤.... – Narendra

1

將解析邏輯移至doinBackground(),如下面的代碼。

@Override 
protected void onPreExecute() 
{ 
     flag = false; 
     progressCount = 0; 
     ProgressDialog progressBar = DdownoadProgressBar(context, 
     progressCount); 
     progressBar.show(); 

} 

@Override 
protected Integer doInBackground(String... urls) { 
    checkNetworkConnection(); 

    if (connectionFlag) { 
     downloadFile1(); 
     progressCount = 1; 
     publishProgress(progressCount); 

     downloadFile2(); 
     progressCount = 2; 
     publishProgress(progressCount); 

     downloadFile3(); 
     progressCount = 3; 
     publishProgress(progressCount); 

     downloadFile4(); 
     progressCount = 4; 
     publishProgress(progressCount); 

     downloadFile5(); 
     progressCount = 5; 
     publishProgress(progressCount); 

     downloadFile6(); 
     progressCount = 6; 
     publishProgress(progressCount); 

     downloadflag = true; 
    } 

    if (downloadflag) { 
     try { 

      parseFile1(); 
      progressCount=7; 
      publishProgress(progressCount); 

      parseFile2(); 
      progressCount=8; 
      publishProgress(progressCount); 

      parseFile3(); 
      progressCount=9; 
      publishProgress(progressCount); 

      parseFile4(); 
      progressCount=10; 
      publishProgress(progressCount); 

      parseFile5(); 
      progressCount=11; 
      publishProgress(progressCount); 

      parseFile6(); 
      progressCount=12; 
      publishProgress(progressCount); 

     } catch (Exception e) { 

      e.printStackTrace(); 
     } 
    } 
    return null; 
} 


@Override 
protected void onProgressUpdate(Integer... progress) 
{ 
    Log.v(TAG, "In progressUpdate..."); 

    progressBar.setProgress(progressCount); 

} 

@Override 
protected void onPostExecute(Integer progress) { 

     try { 

      Log.v(TAG, "Inside onPostExecute...."); 


      progressBar.dismiss(); 
      Toast.makeText(SynchronizeData.this,"Data is successfully downloaded from server.......", Toast.LENGTH_LONG).show(); 

     } catch (Exception e) { 

      e.printStackTrace(); 
     } 

} 
相關問題