带有泄漏上下文的静态字段

时间:2019-09-05 06:38:48

标签: java android static

我的代码是

 // 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);
…

在我运行应用程序并收到错误消息之前,一切看起来都很不错,因为我尝试访问空白字段。

建议?

1 个答案:

答案 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,您可能面临该类活着的时间比需要的时间长的风险)。