2013-09-24 64 views
7

AsyncTask被設計成圍繞線程和處理程序的助手類,並不構成通用線程框架。 AsyncTasks應該理想地用於短操作(幾秒鐘 最多。)Asynctask重度使用

這是它在文檔中說。

說到網絡語言,「幾秒鐘」多久?

我的應用程序將執行以下操作,從數據庫獲取數組列表,將其發送到服務器,獲取另一個列表(json),發送一個好的它收到列表,解析jsons,在db中插入列表, db中的一些其他進程,更新UI ..(該列表可以達到5000-1000個對象實例的條目)。

asynctask對於這樣的東西的用法是個好主意嗎?我還需要根據服務器的響應結果更新gui。

如果不是,我還有其他的替代方案嗎?

+1

IntentService可能嗎? – gunar

+0

有幾個很少超過一個數量級。您所描述的內容似乎相當長,這意味着您將有用戶退出該活動並期望在後臺完成治療。一個asynctask在這裏似乎不太合適。我+1槍和推薦和IntentService – njzk2

+0

什麼「幾個很少超過一個數量級」意味着隊友?這將在後臺默默地完成,用戶不會離開應用程序.. @ njzk2 – tony9099

回答

4

我已經做了類似於你的事情。我下載了一堆圖像(大約5000張),將它保存在SD卡中,並將一行保存在數據庫中。 我已經使用異步任務沒有問題,我沒有看到使用它的問題。我建議你使用一個進度條顯示哪些應用程序是做與取消任務的選項,用戶(的AsyncTask提供了一個取消機制)

+1

好@ACDias,看起來很有希望,所以據我所知,asynctask可以處理我將要執行的額外工作,因爲我的文本只是文本而非圖片。 – tony9099

+0

+1對於progressBar的建議。 – HoodVinci

3

看到這個答案:AsyncTask for long running operations

綜上所述,長期運行AsyncTasks可能會由於其實現而造成內存泄漏。它也可能導致方向變化的問題。

1

這就是我所理解的。 實際上AsyncTask主要與UI相關。例如OnPostExecute在UI線程中執行。

因此,根據我的理解,如果用戶可以合理地等待操作結束,則可以安全地使用AsyncTask。

要知道您的任務是否符合條件,最好的方法就是嘗試一下。

0

關於屏幕方向:

閱讀此頁上的答案後,我意識到,在運行的AsyncTask我的應用程序無法處理方向的變化。

這是我解決這個問題:

@Override 
protected void onPreExecute() { 
    Device.lockOrientation((Activity)context); 
    ... 
} 

@Override 
protected void onPostExecute(List<Hydrant> hydrants) { 
    Device.releaseOrientation((Activity)context); 
    ... 
} 

設備實現:

public class Device { 

    public static void lockOrientation(Activity activity) { 
     Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
     int rotation = display.getRotation(); 
     int tempOrientation = activity.getResources().getConfiguration().orientation; 
     int orientation = 0; 
     switch(tempOrientation) 
     { 
     case Configuration.ORIENTATION_LANDSCAPE: 
      if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) 
       orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
      else 
       orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
      break; 
     case Configuration.ORIENTATION_PORTRAIT: 
      if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270) 
       orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
      else 
       orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
     } 
     activity.setRequestedOrientation(orientation); 
    } 

    public static void releaseOrientation(Activity activity) { 
     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
    } 

} 

由於AsyncTasks只是爲了幾秒鐘運行,這對我來說是一個可以接受的解決方案這很少會影響用戶。特別是有一些ProgressDialog可以很好地表明她需要等待多長時間。