我的應用程序中有一些asynctasks在後臺執行網絡功能(下載/上傳文件,http請求)。在執行這些操作時,我使用ProgressDialog
來顯示有關任務的進度。但是,某些任務可能需要更多時間才能完成(例如,在慢速網絡上下載文件),這在應用程序中是不需要的。使asynctask在超過時間時返回結果
如何設置一個參數來控制每個asynctask的持續時間?無論任務完成的情況如何,我都希望asynctask在某個時候完成。我必須讓asynctask調用onPostExecute方法。
這不是非常有用,因爲用戶界面將凍結並有是的AsyncTask
的持續時間沒有實際控制這是我的代碼的一部分
public void downloadFiles(String address) {
String mainUrl =address;
//// I overrride the onPostExecute to get
/// results and call another asynctask
new Downloader(this){ //<--asynctask
@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
TestResults=result;
//another method called that creates another asynctask
uploadFiles(mainUrl);
}
}.execute(mainUrl);
}
我也嘗試使用像處理程序this 但它也沒有工作。
有一種方法可以在一段時間後使asynctask返回結果(這意味着使asyncTask調用onPostExecute方法)?
在asnctask的doInBackground方法中使用while循環不是解決方案。我想我需要一個來自mainUI的計時器來使asynctask返回結果。
PS我有我的應用程序使用片段,這就是爲什麼我打電話new Downloader(this)
通過gui從片段。
只是嘗試這樣做:
public void downloadFiles(String address) {
String mainUrl =address;
final Downloader tempObject =new Downloader(this){
@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
downloadResults=result;
}
};
try {
tempObject.execute(mainUrl).get(3000L, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TimeoutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
這將使UI凍結3秒鐘,然後任務會誘發....這是不是我想要的。
也嘗試了這一點:
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if (tempObject.getStatus() == Downloader.Status.RUNNING)
tempObject.cancel(true);
}
}, 5000);
這將導致的AsyncTask的onProgressUpdate的消息停下來,但是保持的AsyncTask運行....
任何想法?
你是如何下載文件的?我會把超時在那裏,例如像這樣:http://stackoverflow.com/a/3002544/833647 –
我這樣做你喜歡在你發佈的例子。問題是數據傳輸時連接不會丟失。例如,當你在EDGE netowkr上時,你可能會得到5-6 KB /秒的速度。連接不會丟失,下載可能需要幾分鐘的時間。當服務器沒有響應或幾秒鐘內沒有傳輸時,連接超時。我希望能夠確定asynctask的持續時間,例如,持續少於30秒 –
問題是我想讓asynctask有一定的持續時間。在這段時間之後,asnctask的onPostExecute方法應該叫做 –