2013-05-06 153 views
4

我有一個應用程序,它使用幾個HTTPRequests例如Android上的多線程處理程序的最佳做法是什麼?

  • 得到一個會話ID

  • 得到一些locationdata

  • 得到現有類別

  • (...)等等

我創建了一個HTTPRequestHandler,它基本上管理每個請求的所有AsynTasks ...這很好,但我的問題是,我不知道管理不同AsynTasks的好方法。例如,你需要得到SessionId Task,你可以在我的HTTPRequestHandler我有一個隊列,這將啓動取決於AsyncTasks像這樣開始GetSomeLocationData Task

前:

private void startSessionIdTask(...) { 
    //... 
    GetSessionIdTask mGetSessionIdTask = new GetSessionIdTask(this); 
    mGetSessionIdTask.execute(url); 
} 

//and from the postExecute() in GetSessionIdTask I call 
public void setSessionId(int mSessionId) { 
    mDataHelper.setmSessionId(mSessionId); //set id 


    String url = API_URL + API_GET_FAVORITES + URL_VARIABLE; 

    List<NameValuePair> params = new LinkedList<NameValuePair>(); 
    params.add(new BasicNameValuePair("session_id", getSessionId())); 
    String paramString = URLEncodedUtils.format(params, "utf-8"); 
    url += paramString; 

    //and finally start another Tasks (and so one...) 
    GetLocationsTask mGetLocationsTask = new GetLocationsTask(this); 
    mGetSessionIdTask.execute(url); 

} 

然而,這工作得很好,但問題在於(取決於連接),該隊列需要時間,並且用戶可以啓動其他的AsynTasks,因爲一些最初的數據尚未加載。

我可以設置一些布爾類似isSessionIdLoaded或可以阻止用戶的用戶界面,但我想知道,如果有更好的解決方案?!

所以我的問題是:有沒有辦法將asyntasks放入某種類型的隊列(ArrayList,Map ..),它將在一行中執行?

回答

0

我不完全確定你在問什麼,但是如果你只是想讓一個隊列中的Runnables按順序在後臺線程中執行,那麼Executors.newSingleThreadExecutor()可能就是你要找的。它比它可能需要的更復雜,但您可以通過谷歌輕鬆找到足夠的示例和教程。

1

由於Android 3+ AsyncTasks將在AsyncTask.SERIAL_EXECUTOR上串行執行。因此,在默認情況下,如果你開始2個AsyncTasks

task1.execute(); 
task2.execute(); 

任務2將只執行如果TASK1已經完成(只是檢查的AsyncTask.SERIAL_EXECUTOR的SDK implementaion)。這可以推到這一點,如果task1出於任何原因永遠不會結束,task2將永遠不會啓動,並且您的應用程序已經死鎖。

如果你想你自己的隊列從默認SERIAL_EXECUTOR independed,只需使用

public final AsyncTask<Params, Progress, Result> executeOnExecutor (Executor exec, Params... params) 

,並提供您自己的遺囑執行人(又名線程池)。對於一個項目,我將SERIAL_EXECUTOR實現拷入2個串行隊列。

For Android 2.3 to 1。6所有任務都默認並聯,類同調用的Android 3+:

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,NULL);

不幸的是,在Android 2.3和更低版本中,您沒有指定任務/線程將在其上運行的執行程序的選項。所以如果你想連續完成,你必須自己實現它,只有在onPostExecute()中明確地完成了任務1之後才調用task2。這個概念當然可以推到使用一個任務隊列,其中前一個任務在完成時調用下一個任務(=串行工作隊列)。爲此,你會發現很多文學和模式。

相關問題