2011-05-16 4 views

답변

1

프로그래머 브루스의 답변과 유사하지만 AsyncTask 자체를 통해 Activity를 Param으로 전달하는 대신 생성자를 추가하여 부모 Activity를 가져 오기 만하면됩니다. 내 자신의 코드에서 예 ...

그냥 이렇게하는 활동에서 그것을 만들
public class FileDownloader extends AsyncTask<..., ..., ...> { 
    private MyActivity parentActivity = null; 

    public FileDownloader(MyActivity parentActivity) { 
     this.parentActivity = parentActivity; 
    } 
} 

...

FileDownloader fdl = new FileDownloader(this); 
fdl.execute(...); 

편집 : 귀하의 코멘트에 회신에서, 확인 mLogin을 선언한다 그래도 문제가 해결되지 않으면 public 다음 ...

parentActivity.mLogin 

를 사용할 때, ... 시도

((MyActivity)parentActivity).mLogin 
+0

어떻게이 후 인스턴스 변수를 액세스 할 수 있습니까? 내가 parentActivity.mLogin, 할 수 없어 뭔가를 놓치고있어 ... – user177468

+0

@ user177468 : 내 대답 끝에 EDIT를 참조하십시오. – Squonk

10

액티비티의 내부 (비 정적) 클래스가 아닌 AsyncTask에 활동 또는 Context을 통과 할 때주의해야합니다 -이 때문에 Activity/Context의 수명과 AsyncTask은이 경우에 다르고, 당신이/Context보다 오래 오래 있으면 메모리 누수가 발생합니다.

AsyncTask에서 활동 또는 활동 컨텍스트 자체를 누르기보다는 WeakReference을 활동에 보관해야합니다. 이렇게하면 필요한 경우 Activity와 연관된 메모리를 가비지 수집기 (GC)에서 회수 할 수 있습니다.

public class MyTask extends AsyncTask<..., ..., ...> { 
    private WeakReference<MyActivity> mParentActivity = null; 

    public MyTask(MyActivity parentActivity) { 
     mParentActivity = new WeakReference<MyActivity>(parentActivity); 
    } 

    @Override 
    public ... doInBackground(... params) { 
     // do some stuff 

     // now we do something that requires the context 
     if (mParentActivity.get() != null) { 
      // the WeakReference is still valid and hasn't been reclaimed 
      // by the GC 
      final MyActivity parentActivity = mParentActivity.get(); 
      parentActivity.doSomething(); 
     } 

     // return result 
    } 
} 

이 가장 긴 수명이 상황을 그대로 가능한 ApplicationContext를 사용하려고 항상 Context을 전달합니다.

+0

'parentActivity.doSomething()'은 백그라운드 스레드에서 호출됩니다. 이 메소드가 UI를 수정하면'CalledFromWrongThreadException'을 얻을 것이다. 'postExecute' 콜백에서 그러한 메소드를 실행하십시오. – tomrozb

0

AsyncTask<Object, x x>에서 확장 할 수 있으며 원하는만큼 임의의 매개 변수를 전달할 수 있으므로 전체 활동에 대한 참조를 전달하지 않아도됩니다.

new CustomTask().execute(param1, param2, param3); 

어느 당신은 당신의 doInBackground에서 참조 할 수 있습니다

public Void doInBackground(Object... params) { 
    Integer id = (Integer) params[0]; 
    String name = (String) params[1]; 
    .... 
}