2013-07-04 30 views
1

我的應用程序中有一些asynctasks在後臺執行網絡功能(下載/上傳文件,http請求)。在執行這些操作時,我使用ProgressDialog來顯示有關任務的進度。但是,某些任務可能需要更多時間才能完成(例如,在慢速網絡上下載文件),這在應用程序中是不需要的。使asynctask在超過時間時返回結果

如何設置一個參數來控制每個asynctask的持續時間?無論任務完成的情況如何,我都希望asynctask在某個時候完成。我必須讓asynctask調用onPostExecute方法。

我讀到這個http://developer.android.com/reference/android/os/AsyncTask.html#get%28long,%20java.util.concurrent.TimeUnit%29

這不是非常有用,因爲用戶界面將凍結並有是的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運行....

任何想法?

+0

你是如何下載文件的?我會把超時在那裏,例如像這樣:http://stackoverflow.com/a/3002544/833647 –

+0

我這樣做你喜歡在你發佈的例子。問題是數據傳輸時連接不會丟失。例如,當你在EDGE netowkr上時,你可能會得到5-6 KB /秒的速度。連接不會丟失,下載可能需要幾分鐘的時間。當服務器沒有響應或幾秒鐘內沒有傳輸時,連接超時。我希望能夠確定asynctask的持續時間,例如,持續少於30秒 –

+0

問題是我想讓asynctask有一定的持續時間。在這段時間之後,asnctask的onPostExecute方法應該叫做 –

回答

0

Handler函數的方法需要額外的工作。解決問題的辦法在於here

AsyncTask可能會被取消,但是doInbackground方法仍在運行。實際上,該任務設置爲「取消」值,但doInbackgroung仍將繼續運行直至完成。爲了解決這個問題,我們必須定期檢查doInbackground中的循環,看看任務是否設置爲取消。雖然這不是我想要做的,但這似乎是唯一的解決方案。

doInBackground我們必須檢查任務的狀態,看它是否被取消。所以實際上,有人可以在doInbackground中放置計時器,並且在不使用處理程序類的情況下使生活更輕鬆。

我發現它令人失望,不能隨意終止synctask的執行.....如果任何人有更好的主意,請讓我知道。

相關問題