2017-03-03 117 views
0

我試圖在後臺執行繁重的過程以避免UI滯後。當我在UI線程中執行它時,我沒有響應,但是當我在asyntask中執行時,沒有任何響應,但UI仍然滯後並停留了一段時間。這是我的代碼。Android - Asyntask doInBackground滯後和卡住的UI

private class GenerateTask extends AsyncTask<String, Integer, Void> { 
     @Override 
     protected final Void doInBackground(String... lists) { 
      for (int j = 0; j < 9000; j++) { 
       final Keyword newKeyword = new Keyword(); 
       newKeyword.setId(j); 
       newKeyword.setQuestion_answer_id(j); 
       newKeyword.setKeyword("Keyword ke " + j + " " + UtilHelper.getLocation(j % 9)); 
       newKeyword.setUpdated_at(UtilHelper.getDateTime()); 
       //i think this is the one who causes the lag, but i still need this run on ui thread 
       getActivity().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         UtilDB db = new UtilDB(getActivity().getApplicationContext()); 
         db.replaceKeyword(newKeyword); 
        } 
       }); 
      } 
      progressDialog.dismiss(); 
      return null; 
     } 
    } 
+0

嘗試使用後臺線程,而在數據庫中更新。使用處理程序線程 –

+0

你假設它正在運行一些針對數據庫的東西...但是如果他覺得需要在UI線程上運行它(指示觸摸視圖等),那麼有可能假設是錯誤的 –

+0

是的,其實我需要稍後更新一些用戶界面,這就是爲什麼我需要在UI線程上運行 – huzain07

回答

2

你在做什麼錯是濫用AsyncTask。您可以閱讀鏈接的文檔,以便學習如何使用它(以及何時何地)。

刪除:

getActivity().runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     UtilDB db = new UtilDB(getActivity().getApplicationContext()); 
     db.replaceKeyword(newKeyword); 
    } 
}); 

而且隨着的AsyncTask另一種方法代替:

public void onPostExecute(String newKeyword) { 
    super.onPostExecute(newKeyword); 
    UtilDB db = new UtilDB(getActivity().getApplicationContext()); 
    db.replaceKeyword(newKeyword); 
} 

這需要更改爲:

AsyncTask<String, Integer, String> 
+0

您提到asyntask的正確使用,但runOnUiThread和onPostExcecute都在UI線程上運行。它將如何避免滯後? –

+0

但是,如果我這樣做,我只更換一行,我想要的是更新我的數據庫中的每一行,這就是爲什麼我在每個循環中進行替換。 – huzain07

+0

實際上是造成滯後的那個循環運行在UI線程上,但我需要這樣做。 – huzain07

-1

對不起,我想如果我可以(發表評論我要少聲望)...如果我有你的權利,你想寫入一個循環到一個數據庫和更新用戶界面?

是啊,我其實我需要在以後更新一些UI,這就是爲什麼我需要在UI線程運行

是否有可能分裂兩者兼而有之?首先在HandlerThread的DataBase中寫入,然後通知你的UI通過UiThread更新?

目前您正在將9000個元素放入UiThread隊列中,等待處理。這是很多工作;)

+0

啊,實際上我需要更新一個視圖,每次我更換我的數據庫中的一行。可能嗎? – huzain07

+0

然後我不知道它是否解決了你的滯後問題,但也許你可以在處理程序線程中執行數據庫更新,而不僅僅是在UI線程中更新UI。 或者可能只更新Ui每50,100或500循環? (我猜可能沒有明顯的延遲,但放鬆你的UI線程) – fijili