2012-05-18 4 views
2

개인 내부 클래스로 활동 내에서 많은 AsyncTasks를 사용합니다. 처음부터 나를 괴롭히는 한 가지는 onPostExecute()에서 어떤 컨텍스트를 얻을 수 있습니까?AsyncTask의 onPostExecute()에있는 컨텍스트는 무엇입니까?

아래 표시된 제거 된 예제를 보면 onPostExecute() 내에서 getString()을 사용할 수 있습니다. 통화에 사용 된 컨텍스트는 무엇입니까? doInBackground (예 : OrientationChange) 중에 Activity가 변경되어 해당 컨텍스트가 될 수 없습니다.

현재 Activity 컨텍스트 (task.context = this)를 패치하고 해당 컨텍스트 (context.getString())를 사용합니다.

내 질문 : 주위 Activity의 컨텍스트를 사용하지 않고 Inner Class AsyncTask의 onPostExecute() 내에 getString()을 사용하는 것이 저장 되나요?

미리 감사드립니다. onPostExecute에서

task = new MyAsyncTask(this); 

당신이 공급 포인터로 초기화 클래스 멤버 context을 액세스하는 :

public class MyActivity extends Activity { 

    /* package */ MyActivity context; 

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

     public MyAsyncTask(final MyActivity context) { 
      super(); 

      this.context = context; 
     } 

     @Override 
     protected Cursor doInBackground(/* ... */) { 
      // ... 
     } 

     @Override 
     protected void onPostExecute(/* ... */) { 
      if (context != null) { 
       // Currently I do use that 
       String s = context.getString(R.string.mytext); 
       context.task = null; 
      } 

      // Would this be save? 
      String s2 = getString(R.string.mytext); 
     } 

     @Override 
     protected void onPreExecute (/* ... */) { 
      // ... 
     } 
    } 

    /* package */ MyAsyncTask task; 

    @Override 
    public void onCreate(final Bundle bundle) { 
     // ... 

     Bundle bundleExtras = getIntent().getExtras(); 
     if (bundleExtras != null) { 
      task = (MyAsyncTask) getLastNonConfigurationInstance(); 
      if (task != null) { 
       task.context = this; 
       // ... 
      } else { 
       task = new MyAsyncTask(this); 
       task.execute(); 
      } 
     } 
    } 

    @Override 
    public Object onRetainNonConfigurationInstance() { 
     if (task != null) { 
      // ... 
      task.context = null; 
     } 

     return task; 
    } 
} 

답변

1

주변 활동의 컨텍스트를 사용하지 않고 Inner Class AsyncTask의 onPostExecute() 내에 getString()을 사용하여 저장합니까?

아니요. 안전하지 않습니다. 해당 액티비티의 내부 클래스 인 MyAsyncTask 클래스는 생성시 MyActivity에 대한 참조를 갖습니다. 따라서 MyActivity이 어떤 이유로 든 (회전과 같이) 살해 된 경우 onPostExecute 콜백에서 살해 된 MyActivity 인스턴스의 참조를 보유하는 MyAsyncTask이됩니다.

Activity에 대한 참조를 사용하면 해당 참조가 항상 MyActivity의 유효한 인스턴스를 가리 키도록 업데이트하므로 더 안전합니다. 올바른 참조가 될 때까지 onRetainNonConfigurationInstanceActivity을 직접 입력하고 null을 무효화하여 MyAsyncTaskonPostExecute에 도달하면 MyActivity을 설정할 때까지 다시 만지기를 원할 수도 있습니다.

+0

소리가 적당합니다. 그래서 "getString()"에 패치 된 "컨텍스트"가 없습니다. inPostExecute()는 AsyncTask 주위에 주변 활동이 있기 때문에 간단합니다. 따라서 Android보다 Java가 더 중요합니다. 당신의 대답을 받아 들일 것입니다. 감사. –

+0

"안드로이드보다 자바에 가깝습니다."예, 내부 클래스의 외부 클래스의 메소드에 액세스하고 있습니다. 'Android'에서 이것은 외부 클래스 ('Activity')가 시스템에 의해 독립적으로 죽을 수 있기 때문에 피하기위한 것입니다. – Luksprog

1

당신의 this 포인터 MyAsyncTask()의 인스턴스를 초기화합니다. 귀하의 컨텍스트가 동봉 된 클래스의 컨텍스트, 즉 MyActivity입니다.

+0

네, 그게 제가 현재하고있는 방법입니다. 내 질문은 : "context.getString()"대신 "getString()"을 사용하면 어떻게됩니까? 그것은 저장됩니까? 그리고 내 자신을 사용하지 않을 때 어떤 기본 컨텍스트를 onPostExecute()에 넣을 수 있습니까? –

+2

오해해서 죄송합니다. 그것은 밀폐 된 클래스이기 때문에 여전히 둘러싸는 클래스의 컨텍스트, 즉'MyActivity'를 가져옵니다. 이 문맥에서,이 두 가지는 동등하다 -'context.getString()'과'getString()'. –

관련 문제