2012-07-23 3 views
1

내 응용 프로그램의 주 활동에 새로 고침 버튼이 있습니다. 사용자가 해당 버튼을 누르면 SQLite 데이터베이스 업데이트를 시작하는 새 스레드가 만들어집니다. 이 스레드가 시작되면 사용자는 응용 프로그램의 다른 활동을 시작할 수 있습니다.Android Update 현재 활동 배경에서 스레드

문제는 이러한 다른 작업 (ListActivity)이 해당 배경 스레드가 완료 될 때 DB에 따라 업데이트되어야한다는 것입니다. 어떻게 그걸 제공 할 수 있겠 어. ActivityManager를 사용하여 현재 작업을 얻으려고했으나 원하지 않는 추가 권한이 필요합니다.

+0

하면 AsyncTask를 내부 처리기를 사용한다. –

답변

1

편집 :

죄송합니다. 다음 코드를 살펴보십시오. Chinaski 's (콜백 메소드 용 인터페이스를 사용하는 것과 비슷합니다)와 비슷하지만 메모리 누수를 피할 수있는 방법으로 사용하는 방법을 알기 위해 조금 더 추가했습니다.

onDestroy에서 활동을 분리하는 방법에 유의하십시오. WeakReference를 사용할 수도 있지만 요즘은 setRetainInstance(true) 인 Fragment를 사용하고 조각이 유지 될 때 분리/부착을 완전히 피할 수 있습니다.

MyAsyncTask

public class MyAsyncTask extends AsyncTask<Void, Void, Void> { 

    private Callback mCallback; 

    private boolean mIsComplete = false; 

    private boolean mHasCallbackBeenCalled = false; 

    public MyBackgroundTask(Callback callback) { 
     mCallback = callback; 
    } 

    /** Only safe to call this from the UI thread */ 
    public void attach(Callback callback) { 
     mCallback = callback; 

     if (mIsComplete && !mHasCallbackBeenCalled) { 
      fireCallback(); 
     } 
    } 

    /** Only safe to call this from the UI thread */ 
    public void detach() { 
     mCallback = callback; 
    } 

    @Override 
    public void doInBackground() { 
     // do the heavy stuff here 
     return null; 
    } 

    @Override 
    public void onPostExecute(Void result) { 
     mIsComplete = true; 
     fireCallback(); 
    } 

    private void fireCallback() { 
     if (mCallback != null) { 
      mCallback.callbackMethod(); 
      mHasCallbackBeenCalled = true; 
     } 
    } 

    public static interface Callback { 

     public void callbackMethod(); 

    } 
} 

MyActivity

public class MyActivity extends Activity implements MyAsyncTask.Callback { 

    private MyAsyncTask mTask; 

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

     // Check for a retained task after a configuration change 
     // e.g. a rotation 
     if (getLastNonConfigurationInstance() != null) { 
      mTask = (MyAsyncTask) getLastNonConfigurationInstance(); 
      // Re-attach the task 
      mTask.attach(this); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     // Detach from task to avoid memory leak 
     if (mTask != null) { 
      mTask.detach(); 
     } 

     super.onDestroy(); 
    } 

    @Override 
    public Object onRetainNonConfigurationInstance() { 
     // Retain the async task duration a rotation 
     return mTask; 
    } 

    /** Callback method */ 
    @Override 
    public void callbackMethod() { 
     // Do something here 
    } 

} 
+0

죄송하지만이 솔루션으로 문제가 해결되는지 이해할 수 없습니다. 내 문제는 어떤 활동의 UI를 업데이 트하는 것입니다, B (우리는 C, D, E 등등이 될 수 있는지 알지 못합니다.), 다른 활동의 스레드 안에서 A라고 말하십시오. – yslr

+0

미안합니다. 제 수정 된 게시물을 참조하십시오. –

0

스레드와 대기열 "작업"이있는 싱글 톤을 만들 수 있습니다. 작업이 끝나면 다음 작업을 확인/실행하고 작업을 추가 할 때 작업을 이미 시작했거나 작업이 이미 실행중인 경우 대기열에 추가합니다.

나는 이것이 최선의 해결책이라고 말하지는 않지만 그 중 하나입니다.

+0

답장을 보내 주셔서 감사합니다. 나는 실제로 그 하나를 생각했지만 당신이 언급했듯이 그것이 좋은 해결책인지 확신 할 수 없습니다. 나는 안드로이드 시스템 클래스/기능을 사용하는 솔루션을 찾고있다. – yslr