2012-07-26 2 views
0

내 응용 프로그램에는 웹에 연결하기 위해 AsyncTask를 호출 할 수있는 곳이 여러 개 있습니다. 활동 등을 통해 백그라운드 서비스를 이용할 수 있습니다.안드로이드에서 동기화 작업

SQLite 데이터베이스를 읽고 쓰고 있기 때문에 비슷한 작업에서 여러 작업이 겹치는 경우 (GetMail이 백그라운드에서 실행되고 사용자가 수동으로 시작했다고 가정 해 봅시다) 다양한 문제가 있습니다.

이 작업의 유형을 동기화하려면 다음과 같은 코드를 작성하십시오. 나는 그것을 테스트하는 방법을 잘 모르겠어요, 확인을 실행하는 것 같지만 나는이 유효 인 경우 귀하의 의견을 얻고 싶었다 .. 여기

public enum AsyncTasks 
{ 
    GetMail, 
    PostMail, 
} 
public class MyApplication extends Application 
{ 
    private final ArrayList<AsyncTasks> mLockedAsyncTasks = new ArrayList<AsyncTasks>(); 


    public boolean lockAsyncTask(AsyncTasks task) 
    { 
     synchronized (mLockedAsyncTasks) 
     { 
      if (!mLockedAsyncTasks.contains(task)) 
      { 
       mLockedAsyncTasks.add(task); 
       return true; 
      } 

      return false;    
     }   
    } 

    public void unlockAsyncTask(AsyncTasks task) 
    { 
     synchronized (mLockedAsyncTasks) 
     { 
      if (mLockedAsyncTasks.contains(task)) 
      { 
       mLockedAsyncTasks.remove(task); 
      } 
     } 
    } 
} 

아이디어는 내가 lockAsyncTask를 호출하면 성공하고있어 것입니다 - 나는 진행 HTTP를 사용하고 그렇지 않으면 이미 실행 중이므로 건너 뜁니다.

답변

1

단일 작업자 스레드가 지원하는 작업 대기열을 사용하는 것이 더 쉽습니다. 그렇게하면 모든 작업이 수신 된 순서대로 실행됩니다. 팩토리 메서드 Executors을 사용하면 쉽게이 작업을 수행 할 수 있습니다. 다음은 간단한 예입니다.

private static final ExecutorService mThreadPool = 
     Executors.newSingleThreadExecutor(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mThreadPool.execute(new Runnable() { 
     public void run() { 
      // Do some work here... 
     } 
    }); 

    mThreadPool.execute(new Runnable() { 
     public void run() { 
      // Do some additional work here after 
      // the first Runnable has finished... 
     } 
    }); 
} 
관련 문제