2011-01-31 2 views
1

나는 시각 장애인 용 응용 프로그램을 개발 중입니다. TextToSpeech 모듈, GPS 및 네트워크 연결로 항상 작업해야합니다.다른 작업을 시작하는 가장 좋은 방법

다음과 같은 쿼리를 수행해야합니다. GPS를 참조하고 JSON 호출을 수행하고 TextToSpeech (TTS) 모듈을 호출해야합니다.

UI 주 스레드와 통신하는 다른 작업을 처리하는 가장 좋은 방법은 궁금합니다. 나는 지금까지 보았다 : 핸들러 객체와 AsyncTask 클래스.

각 작업을 순차적으로 실행해야하므로 네트워크에서 데이터를 검색 한 후 TTS를 호출하고 싶습니다. 그래서 나는 "mHandler.post (Runnable)"을 사용했고 그 runnable 내에서 다른 것을 호출하는 등등.

그러나 나는 AsynTask 클래스를 사용하는 것이 좋습니다. 그러나이 경우 모든 작업에 대해 다른 클래스를 구현해야한다고 생각하지만 반면에 이러한 작업이 순차적으로 실행되는지는 알 수 없습니다. 예 :

AsyntaskClass1 at1; 
AsyntaskClass2 at2; 
AsyntaskClass3 at3; 

at1.execute(); 
at2.execute(); 
at3.execute(); 

작업이 순서대로 실행됩니까? TTS 모듈을 원인 네트워크 작업이 끝날 때까지 당신의 도움에 대한

감사합니다,

BR.David ... 기다려야한다.

답변

0

두 번째 AsyncTask를 먼저 한 기다리지 않습니다 즉, 그들은 거의 동시에 실행됩니다 아니오 ... 마무리 없습니다.

하나의 AsyncTask에서 모든 작업을 수행하고 publishprogress()를 사용하여 각 작업이 완료된 후에 UI를 업데이트하는 것이 좋습니다.

은 그래서 당신은 네트워크 완료된 후 그 AsyncTask를 시작할 수 있으며, UI는 순차적으로

예를 들어

를 업데이 트합니다.

public Object doInBackground(Object... params){ 
    //do task one's stuff 
    publishProgress(1); 
// do task two's stuff 
publishProgress(2) 
    //do task 3 
publishProgress(3) 


} 
public void onProgressUpdate(Integer... int){ 
switch(int[0]){ 
case 1: 
//ui update for task 1 
case 2: 
//ui update for task 3 
case 3: 
//ui update for task 3 
} 
1

단일 AsyncTask를 클래스로 모든 수 :

private class AsyncTask1 extends AsyncTask<Object, Void, Object> { 

@Override 
protected String doInBackground(Object... args) { 
    // Get a result from the GPS. 

    // Make a network call 

    // Communicate with the TTS 
    } 

@Override 
protected void onPostExecute(Object result) { 
    // Return a result to the main thread 
    // You are only allowed to touch the UI here 
    } 

} 
0

귀하의 예에서는 실행 순서가 보장되지 않습니다. UI 스레드는 3 개의 AsyncTasks를 시작합니다. 이 세 가지 작업은 동시에 실행됩니다. 당신이 동 기적으로 작업의 코드를 실행하려면

당신이 방법의 적어도 몇을 acomplish해야 :

당신이 순차적으로 수행 할 작업을 주문한 곳 하나에 세 가지 작업을 결합 예 :

AsyncTaskCombined task = new AsyncTaskCombined(); 
task.execute(); 

private class AsyncTaskCombined extends AsyncTask<Void, Void, Void> { 
    protected Bitmap doInBackground(Void... urls) { 
     // Initialize classes that implement the work logic 
     Work1 work1; 
     Work2 work2; 
     Work3 work3; 
     // Do the work sequentially... 
     work1.doWork(); 
     work2.doWork(); 
     work3.doWork(); 
    } 
} 

또는 잠재적으로 당신은 첫 번째 작업으로 만들고 두 번째 AsyncTask를 부르는 onPostExecute에서 다음 3 가지 AsyncTask를하고있을 수 있고, 두 번째 AsyncTask를의 onPostExecute에서 만든 세 번째와 마지막 AsyncTask를 부른다. 그러나 그것은 나를 조금 contrieved 것 같습니다 ...

// 에밀 H

관련 문제