2011-02-04 71 views
3


我有一個應用程序,它運行一個長任務並返回一個值。任務正在運行時,ProgressDialog會顯示進度。任務完成後,我想在TextView中顯示結果。我在FutureTask中運行任務。
我的問題是,如果我嘗試獲得結果,FutureTask的.get()方法會阻止UI線程,並且我看不到ProgressDialogTextView顯示結果的屬性)。ProgressDialog後顯示長任務的結果

我的任務代碼(池的ExecutorService):

final FutureTask<String> future = new FutureTask<String>(new Callable<String>() { 
    @Override 
    public String call() { 
     return myLongTask(); 
    } 
}); 
pool.execute(future); 

事後我打電話的RunnableupdateProgressBar()其中具有Handler更新ProgressDialog

Runnable pb = new Runnable() { 
    public void run() { 
     myUpdateProgressBar(); 
    } 
}; 
pool.execute(pb); 

現在我越來越結果,阻止UI線程阻止ProgressDialog顯示:

String result = future.get() 

如果我嘗試把結果updateProgressBar()方法中(通過將未來作爲一個參數)的ProgressDialog駁回後,一個異常被拋出:

只有創建視圖原來的線程層級可以觸及其觀點。

任何想法如何解決這個問題? (我聽說過AsyncTasks但我無法弄清楚如何propertly使用它們。)

回答

0

是的,我有類似的問題時impleme nting ExecutorService的,下面的代碼塊中的UI線程和需要在分離的線程中運行:

String result = future.get() 

只是創建一個類延伸的AsyncTask處理future.get()方法如下面的代碼例如:

private class FutureTask extends AsyncTask<Future<String>, Void, String>{ 

    @Override 
    protected PhotoToView doInBackground(Future<String>... params) { 
     Future<String> f = params[0]; 
     try { 
      return f.get(30, TimeUnit.SECONDS); 
     } 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(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String futureResult) { 
     super.onPostExecute(futureResult); 

     // this method is run on UI thread 
     // do something with the result 
     // or simply hide the progress bar 
     // if you had previously shown one. 

    } 
} 

並運行未來的線程:

FutureTask ft = new FutureTask(); 
ft.execute(future); 

希望這有助於。

+1

爲了從FutureTask中獲取數據,使用AsyncTask(從某種意義上來說是FutureTask的替代品)看起來有點矯枉過正?你最好在AsyncTask中運行一遍 – 2014-01-12 16:53:48