활동에서 호출되는 AsyncTask (별도의 파일에 있음)가 있습니다. AsyncTask를 인스턴스화하면 액티비티가 param으로 전송됩니다. AsyncTask의 onPostExecute 메서드에서 acitivity의 인스턴스 변수에 어떻게 액세스합니까?AsyncTask 내의 활동에서 인스턴스 변수에 액세스
감사합니다.
활동에서 호출되는 AsyncTask (별도의 파일에 있음)가 있습니다. AsyncTask를 인스턴스화하면 액티비티가 param으로 전송됩니다. AsyncTask의 onPostExecute 메서드에서 acitivity의 인스턴스 변수에 어떻게 액세스합니까?AsyncTask 내의 활동에서 인스턴스 변수에 액세스
감사합니다.
프로그래머 브루스의 답변과 유사하지만 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
액티비티의 내부 (비 정적) 클래스가 아닌 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
을 전달합니다.
'parentActivity.doSomething()'은 백그라운드 스레드에서 호출됩니다. 이 메소드가 UI를 수정하면'CalledFromWrongThreadException'을 얻을 것이다. 'postExecute' 콜백에서 그러한 메소드를 실행하십시오. – tomrozb
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];
....
}
어떻게이 후 인스턴스 변수를 액세스 할 수 있습니까? 내가 parentActivity.mLogin, 할 수 없어 뭔가를 놓치고있어 ... – user177468
@ user177468 : 내 대답 끝에 EDIT를 참조하십시오. – Squonk