2011-02-04 31 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

相关问题