2012-07-24 2 views
1

doInBackground()AsyncTask (사용자에게 UI 스레드의 선택 사항을 보여주는 대화 상자)에서 일부 작업을 수행하는 동안 사용자에게 몇 가지 세부 정보를 묻고 사용자가 선택한 후 대화 상자에서 선택한 매개 변수를 사용하여 doInBackground()의 작업을 계속합니다.사용자에게 세부 사항을 묻는 AsyncTask를 일시 중지하는 방법은 무엇입니까?

이 매개 변수를 doInBackground()으로 전송하는 가장 좋은 메커니즘은 무엇입니까? 스레드를 일시 중지하고 계속해야하는 방법 doInBackground() (아마도 object.wait()notify()?)? 이 목적으로 Handler을 사용해야합니까?

+2

왜 다른 AsyncTask를 갈 해달라고? 사용자 입력 후처럼? – SALMAN

+0

AsyncTask는 실제로 데이터베이스 버전 업그레이드를 수행합니다 ... 그리고 사용자는 새 열에 대해 일부 데이터를 지정해야합니다. 하나 이상의 AsyncTask로 데이터베이스를 분할하는 것은 그 결과가 그리 좋지 않을 것 같습니다. – Prizoff

+0

마침내 내가 그런 해결책을 찾은 것 같습니다. 나는 onPreExecute()에서 사용자의 모든 정보를 묻습니다 ... – Prizoff

답변

4

입니다.

  1. 당신은 그것을() 물건을 통지 /) 잠금 개체를 사용하여 평소 대기 (수행 할 수 있습니다 이것이 가능하지 않다면 몇 가지 가능성이있다.

  2. 대기열을 사용하여 UI 스레드에서 백그라운드 스레드로 데이터를 전달하고 모든 잠금을 처리하도록합니다. 이 (의사 코드의 종류)와 같은

뭔가

class BackgroundTask extends AsyncTask<BlockingQueue<String>, ...> { 
    void doInBackground(BlockingQueue<String> queue) { 
     ... 
     String userInput = queue.take(); // will block if queue is empty 
     ... 
    } 
} 

// Somewhere on UI thread: 
    BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1); 
    BackgroundTask task = new BackgroundTask<BlockingQueue<String>,....>(); 
    task.execute(queue); 
    .... 
    .... 
    String userInput = edit.getText().toString(); // reading user input 
    queue.put(userInput); // sending it to background thread. If thread is blocked it will continue execution 
1

나는 내 대답이 당신의 문제를 확실하게 해결할 수 있기를 바랍니다.

// ALL doInBackground 코드() AsyncTask를 방법 BELOW DO

String userInput=""; 

     YouActivity.this.runOnUiThread(new Runnable() { 

      public void run() { 


      //SHOW YOUR DIALOG HERE 

      } 
     }); 


     while("".equals(userInput)) 
     { 
      YouActivity.this.runOnUiThread(new Runnable() { 

       public void run() { 

       userInput=editText.getText().toString();//fetching user input from edit Text  
       } 
      }); 

     } 

감사합니다 :)

+7

CPU의 100 %를 사용하여 스레드에서 계속 반복하는 것은 좋은 생각이 아니다. 이것은 리소스를 낭비하지 않고 대기중인 쓰레드를 멈추게 할 간단한 wait()/notify() 쌍으로 대체 될 수있다. – uaraven

+0

나를 투표하는 것보다는 답변을 게시하는 것이 좋습니다. – SALMAN

+2

만약 당신이 훨씬 더 좋은 해결책을 가지고 있다면 답으로 게시 해주십시오. 감사합니다 – SALMAN

1

당신이하는 Callable를 사용 Executor에 제출할 수는 ExecutorFutureTask를 반환합니다 그러면 while 루프에서 FutureTask.isDone == true까지 기다릴 것입니다.

이 여기에 내가 실제로 백그라운드 작업을 시작하기 전에 입력을위한 사용자를 물어 보곤 예 http://programmingexamples.wikidot.com/futuretask

+0

이것은 일이 IMO가 될 필요 이상으로 어렵게 만듭니다. –

+1

@Alex Lockwood 나는 너에게 동의하지 않는다. Executor 프레임 워크에 대한주의를 끌기 위해서만 대답했습니다. –

+0

저는이 다소 사소한 예에 대해서만 이야기했습니다 ...그것은 장기적/미래의 사업을 위해 기꺼이 데려 올 가치가 있습니다. 실제로, 'AsyncTask' [documentation] (http://developer.android.com/reference/android/os/AsyncTask.html)도 역시 이것을 권장합니다 :) –

관련 문제