我的代码是
// 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);
…
在我运行应用程序并收到错误消息之前,一切看起来都很不错,因为我尝试访问空白字段。
建议?
答案 0 :(得分:1)
问题在于,当您将内部类设为静态时,您将不再有权访问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,您可能面临该类活着的时间比需要的时间长的风险)。