2013-05-12 5 views
2

나는 여러 탭으로 안드로이드 응용 프로그램을 devloping 오전. 내 탭에는 다음이 있습니다.안드로이드에서 한 번에 여러 서비스를 실행

첫 번째 탭 - 잡지의 보관 파일을 격자보기로 보여줍니다. 의도는 그리드보기 항목을 탭할 때 웹 사이트에서 큰 파일을 다운로드해야합니다. 이를 위해 파일을 다운로드하는 ASYNC 태스크가있는 서비스를 작성했습니다. 코드를 보여 줬어.

public class DownloadArchivesService extends BaseService { 
private static final String TAG = "DownloadArchivesServices"; 
private static final String STOP = "stop_modificator"; 
public static final String ALREADY_RUNNING= "DownloadArchivesService_Already_Running"; 
public static final String ARCHIVES_PERCENTAGE_PROGRESS ="Archives_Percentage_Progress"; 
public static final String UPDATE_ARCHIVES_PROGRESS = "Update_Archives_Progress"; 

@Override 
public void onCreate() { 
      getPreferences().edit().putBoolean(ALREADY_RUNNING, true).commit(); 
    application = (JfwApplication)this.getApplicationContext(); 
    context = this; 
    session = application.getSession(); 
    calendar = Calendar.getInstance(); 
    dateFormat = new SimpleDateFormat("dd-MMM-yyyy"); 
    magazineManager = new MagazineManager(this); 

    //magazine = new Magazine(fileName, fileName, "", "", this); 


    new AsyncTask<String, Integer, String>() { 

    NumberFormat formater = NumberFormat.getPercentInstance(Locale.getDefault()); 
    @Override 
    protected void onPreExecute() { 

     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     // I do my download here  } 

    @Override 
    protected void onProgressUpdate(Integer... p) { 
     if (isCancelled()) { 
      return; 
     } 
     //I udpate my progress bar here  } 

    @Override 
    protected void onPostExecute(String result) { 

     Intent intentInvalidate = new Intent(ArchivesActivity.GRID_INVALIDATE); 
     sendBroadcast(intentInvalidate); 

     super.onPostExecute(result); 
    } 
}.execute(); 

super.onCreate(); 


} 

두 번째 탭으로 이동하면 웹 사이트에서 몇 장의 사진을 다운로드하여 화면에 표시해야합니다. 위의 DownloadImagesService와 비슷한 서비스를 작성했습니다.

그러나 문제는 위에서 언급 한 DownloadArchivesService가 실행 중일 때 (즉, 에 DownloadArchivesService를 호출하기위한 격자보기 항목을 누를 때) 두 번째 탭으로 이동하여 DownloadImageService (다운로드 사진)가 호출되지 않고 DownloadArchivesService가 완료 될 때까지 기다립니다. 이렇게하면 첫 번째 서비스가 완료되기 전에 사용자가 기다릴 수 있습니다. 서비스가 주 스레드에서 실행되고 하나의 서비스가 이미 실행중인 서비스가 실행될 때까지 기다려야한다는 것을 알고 있습니다. 예기치 않은 서비스를 기다리지 않고 다른 서비스 (또는 백그라운드 작업)를 동시에 실행할 수있는 방법이 있습니까?

서비스, 의도 서비스 및 스레드에 대한 다양한 문서를 살펴 보았습니다. 그러나 나는 andorid가 동시 서비스를 처리하는 방법에 대해이 특별한 것을 강조 할 수 없었다.

나는 이것에 대한 도움을 크게 주시면 감사하겠습니다. 제 설명이 명확하지 않은 경우 알려주십시오.

감사합니다.

+0

다른 상속 당신의 서비스 중 하나로,이 목적을 위해 집행을 사용하는 것이 좋습니다까요? 또는 같은 학급의 두 사람 모두?직접 BaseService 클래스를 작성 했습니까? 아니면 Android와 함께 제공 되었습니까? 확실하지 atm. 그렇다면이 게시물을 확인하십시오 : http://stackoverflow.com/questions/8150430/android-multiple-services-dont-run-as-expected?rq=1 – pumpkee

+0

@ Androidika, 두 서비스 모두 BaseService 클래스를 상속합니다. 이것은 android 클래스가 아닙니다. –

+0

@androidika ,. 내가 언급 한 소식을 보았습니다. 나는 서비스를 독립적으로 만들려고 노력할 것이다. 당신의 도움을 주셔서 감사합니다. 그것은 매우 빨랐다. 사실 저는 모든 게시물이 저에게 준 명확성을 통해서만 제 신청서를 작성하고 있습니다. 모든 도움에 감사드립니다. –

답변

2

AsyncTask는 스레드 및 처리기 주위의 도우미 클래스로 디자인되었으며 일반 스레딩 프레임 워크를 구성하지 않습니다. AsyncTasks는 짧은 작업 (최대 몇 초)에 이상적으로 사용되어야합니다. 오랜 시간 동안 스레드를 계속 실행해야하는 경우 java.util.concurrent pacakge에서 제공하는 다양한 API를 사용하는 것이 좋습니다. Executor, ThreadPoolExecutor 및 FutureTask.

처음 소개되었을 때, AsyncTasks는 단일 백그라운드 스레드에서 연속적으로 실행되었습니다. DONUT으로 시작하여 여러 스레드가 병렬로 작동 할 수 있도록 스레드 풀로 변경되었습니다. HONEYCOMB부터는 병렬 실행으로 인해 발생하는 일반적인 응용 프로그램 오류를 방지하기 위해 단일 스레드에서 작업이 실행됩니다.

실제로 병렬 실행을 원할 경우 THREAD_POOL_EXECUTOR을 사용하여 executeOnExecutor (java.util.concurrent.Executor, Object [])를 호출 할 수 있습니다.

http://developer.android.com/reference/android/os/AsyncTask.html

난 당신이

http://developer.android.com/reference/java/util/concurrent/Executor.html

+0

executeOnExecutor를 실행 해봤는데 정상적으로 작동했습니다. 당신의 도움을 주셔서 감사합니다. –

+0

도움이 된 것을 기쁘게 생각합니다. – Raghunandan

5

Android 4.0 이상 AsyncTask에는 단일 실행 스레드가 제공됩니다. 따라서 2nd AsyncTask은 첫 번째 완료 후에 실행됩니다.

처리 방법은 Multiple Async Task not running in android 4.1을 참조하십시오.

+0

, 답장을 보내 주셔서 감사합니다. 비동기 작업이 다른 서비스의 일부로 실행 되더라도 두 번째 작업은 첫 번째 작업 이후에 실행됩니다. –

관련 문제