2014-01-23 40 views
1

工作我使用的是AsyncTask從服務器下載數據的一些大的量我的AsyncTask做工精細,所以我增加了一個進度條,使一切美麗的,但問題是,當它的運行進度條獲得凍結一半時和我使用進度對話框,也同樣凍結了一半時,進度不是裏面的AsyncTask

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

    ProgressDialog progressDialog; 

    @Override 
    protected String doInBackground(String... url) { 
     String data = ""; 

     try { 
      // Fetching the data from web service 
      data = getLinksfromServer(url[0]); 
     } catch (Exception e) { 
      Log.d("Background Task", e.toString()); 
     } 
     return data; 
    } 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     progressDialog= ProgressDialog.show(Settings.this, "Synchronicing","Synchronicing", true); 


    } 



    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     JSONObject json; 
     try { 
      json = new JSONObject(result); 
      db.deleteAll(); 
      final JSONArray jsonArray = json.getJSONArray("XXXX"); 

      for (int i = 0; i < jsonArray.length(); i++) { 
           ///use for insert datainto database 
      } 
      finish(); 

      progressDialog.dismiss(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      Log.e("settings", "", e); 
      progressDialog.dismiss(); 

     } 
    } 

能有人告訴我,爲什麼出現這種情況,請

+0

你在哪裏更新你的進度條狀態? – nKn

+0

是類downloadChannelsfromserver,是設置活動的內部類嗎? –

+0

試圖拒絕你的對話框打電話之前在活動結束 完成(); progressDialog.dismiss(); 交換它們? – Abs

回答

2

原因進度條卡住是我JSON解碼因爲onPostExecute屬於UI線程它需要幾個時間來解碼JSON結果。所以它會凍結用戶界面直到JSON解碼,所以將解碼部分移動到doInBackground將解決用戶界面凍結問題,因爲doInBackground屬於後臺線程

1

請編輯您這樣的代碼:

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

ProgressDialog progressDialog; 

public downloadChannelsfromserver() 
{ 
    progressDialog = new ProgressDialog(Settings.this); 
    progressDialog.setTitle("Synchronicing ..."); 
    progressDialog.setCancelable(false); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
} 

@Override 
protected String doInBackground(String... url) { 
    String data = ""; 

    try { 
     // Fetching the data from web service 
     data = getLinksfromServer(url[0]); 
    } catch (Exception e) { 
     Log.d("Background Task", e.toString()); 
    } 
    return data; 
} 

@Override 
protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    //super.onPreExecute(); 
    progressDialog.show(); 

} 



@Override 
protected void onPostExecute(String result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
    JSONObject json; 
    try { 
     json = new JSONObject(result); 
     db.deleteAll(); 
     final JSONArray jsonArray = json.getJSONArray("XXXX"); 

     for (int i = 0; i < jsonArray.length(); i++) { 
          ///use for insert datainto database 
     } 
     finish(); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     Log.e("settings", "", e); 
    } 
    finally 
    { 
    progressDialog.dismiss(); 
    } 
} 

我希望這有助於。

+0

仍同樣它得到凍結後不久顯示 –

+0

請分享您的Logcat日誌,當你的進度對話框凍結,謝謝。 –

2

關注這個代碼

private ProgressDialog pdialog = null; 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 

    if(pdialog ==null){ 
    //display progress dialog like this 
    pdialog = new ProgressDialog(context); 
    pdialog.setCancelable(false); 
    pdialog.setMessage("Please Wait..."); 
    pdialog.show(); 
    } 
} 



@Override 
    protected void onPostExecute(Boolean result) { 
     super.onPostExecute(result); 
     //dismiss progress dialog like this 

     if(pdialog!=null){ 
      pdialog.dismiss(); 
      pdialog = null; 
     } 
    }