我的代码是
// Asynctask class to handle load data from database in background
private class SyncGetLocations extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mPrgLoading.setVisibility(View.VISIBLE);
mScrollView.setVisibility(View.GONE);
mToolbarView.setVisibility(View.GONE);
}
@Override
protected Void doInBackground(Void... voids) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Get data from database
getLocationDataFromDatabase(mSelectedId);
return null;
}
… etc
Android studio 报告该 Asynctask 类应该是静态的,否则可能会发生泄漏。
当更改为静态时,会出现很多错误,例如无法从静态上下文引用非静态方法和字段。
我添加:
MyActivity myactivity = new MyActivity();
myactivity.mPrgLoading.setVisibility(View.VISIBLE);
…
一切看起来都很好,直到我运行应用程序并收到错误,因为我尝试访问空字段。
建议?
最佳答案
问题是,当您将内部类设为静态时,您将无法再访问 Activity 及其属性。一种解决方法是在 AsynkTask 中对 Activity 进行弱引用:
private static class YourTask extends AsyncTask<Void, Void, Void> {
private WeakReference<YourActivity> activityReference;
YourTask(YourActivity context) {
activityReference = new WeakReference<>(context);
}
@Override
protected String doInBackground(Void... params) {
return "task finished";
}
@Override
protected void onPostExecute(String result) {
YourActivity activity = activityReference.get();
if (activity == null || activity.isFinishing()) return;
activity.myVariable = "example";
TextView textView = activity.findViewById(R.id.textview);
textView.setText(result);
}
}
无论如何,我认为将 AsyncTask 创建为顶级类而不是内部类也可以解决您的问题(作为内部类,由于 AsyncTask,您面临类存活时间超过所需时间的风险) )。
关于java - 具有泄漏上下文的静态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57799699/