2011-02-04 2 views
3


긴 작업을 실행하고 값을 반환하는 응용 프로그램이 있습니다. 작업이 실행되는 동안 ProgressDialog에 진행 상태가 표시됩니다. 작업이 완료되면 결과를 TextView에 표시하고 싶습니다. FutureTask에서 작업을 실행합니다.
결과를 얻으려고 시도하면 FutureTask의 .get() 메서드가 UI 스레드를 차단하고 ProgressDialog (결과가 제대로 표시되지 않음)이 표시되지 않습니다.ProgressDialog 이후에 긴 작업 결과 표시

작업에 대한 나의 코드 (풀 ExecutorService입니다입니다) :

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

그리고 나중에 내가 Handler으로 ProgressDialog을 업데이트 이는 Runnable에서 updateProgressBar() 전화 : 내가지고있어 이제

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

그 결과는 UI 스레드를 차단하여 ProgressDialog이 표시되지 않도록합니다.

나는해서 ProgressDialog가 일축 한 후 (매개 변수로 미래를 전달하여)을 updateProgressBar() 메서드 내 결과를 넣어하려고하면

는, 예외가 발생합니다 : 뷰를 생성

만 원래의 스레드 계층 구조가 해당 뷰를 만질 수 있습니다.

어떤 아이디어로이 문제를 해결할 수 있습니까? (나는 AsyncTasks에 대해 들어 본 적이 있지만 나는 propertly을 사용하는 방법을 알아낼 수 없습니다.) 당신은 당신이 필요로하는 것이 올바른

답변

0

예, 나는 때 impleme을 비슷한 문제가 있었다

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. 

    } 
} 
:

String result = future.get() 

바로 다음 코드 예처럼 future.get() 방법을 처리하도록 AsyncTask를 연장하는 클래스를 생성 : nting ExecutorService에, 다음 코드 블록 UI 스레드와 분리 된 스레드에서 실행해야

그리고 다음 스레드를 실행하십시오.

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

희망이 있습니다.

+1

AsyncTask (어떤 점에서 FutureTask의 대안 인)을 사용하면 조금 지나치게 과장되어서 FutureTask에서 데이터를 가져올 수 없습니까? –

+0

@ElectricCoffee AsyncTask 문서는 오랜 작업에는 사용해서는 안된다고 말합니다. 'FutureTask'를 사용할 것을 권장합니다. –