2012-11-04 87 views
0

由於android,該任務只能執行一次。我們可以在AsyncTask中多次運行HttpClient嗎?

我想在UI線程中運行HttpClient。但它只允許一次。如果我想從另一個尚未在第一次啓動時運行的鏈接獲取另一個數據,我該怎麼做?直到我第一次啓動應用程序時才獲取所有數據,這需要很長時間。有沒有人知道如何解決這個問題?

+0

這是非常低效的(每次執行新的AsyncTask時,一次又一次地初始化/構造HttpClient),更好的解決方案是綁定一個服務(只在這裏初始化/構造httpClient一次),然後調用網絡方法該服務只要您需要在您的代碼中執行網絡操作。 – yorkw

回答

2

您正在主線程上運行網絡操作。使用異步任務在後臺線程中運行網絡操作(在後臺線程中執行您的http請求)。

做你的網絡的異步任務是這樣的:

class WebRequestTask extends AsyncTask{ 


    protected void onPreExecute() { 
    //show a progress dialog to the user or something 
    } 

    protected void doInBackground() { 
     //Do your networking here 
    } 

    protected void onPostExecute() { 
     //do something with your 
     // response and dismiss the progress dialog 
    } 
    } 

    new WebRequestTask().execute(); 

下面爲大家介紹一些教程,如果你不知道如何使用異步任務:

http://mobileorchard.com/android-app-developmentthreading-part-2-async-tasks/

http://www.vogella.com/articles/AndroidPerformance/article.html

以下是Google的官方文檔:

https://developer.android.com/reference/android/os/AsyncTask.html

您可以在需要執行下載任務時多次調用異步任務。您可以將參數傳遞給異步任務,以便可以指定應該下載的數據(例如,每次將不同的url作爲參數傳遞給異步任務)。通過這種方式,使用模塊化方法,您可以使用不同的參數多次調用同一個異步任務來下載數據。 UI線程不會被阻塞,所以用戶體驗不會受到阻礙,並且您的代碼也會線程安全。

+0

非常感謝您的第一個鏈接。 –

2

您可以在的AsyncTask

protected Void doInBackground(Void param...){ 
    downloadURL(myFirstUrl); 
    downloadURL(mySecondUrl); 
} 

一個的AsyncTask做多的操作只能執行一次。這意味着,如果您創建AsyncTask的實例,則只能調用​​一次。如果要再次執行AsyncTask,請創建一個新的AsyncTask:

MyAsyncTask myAsyncTask = new MyAsyncTask(); 
myAsyncTask.execute(); //Will work 
myAsyncTask.execute(); //Will not work, this is the second time 
myAsyncTask = new MyAsyncTask(); 
myAsyncTask.execute(); //Will work, this is the first execution of a new AsyncTask. 
+0

感謝您的評論,讓我嘗試一下。 –

相關問題