java - 具有泄漏上下文的静态字段

标签 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);
…

一切看起来都很好,直到我运行应用程序并收到错误,因为我尝试访问空字段。

建议?

最佳答案

问题是,当您将内部类设为静态时,您将无法再访问 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/

相关文章:

Android 从服务器自动完成 EditText

java - Java 中的变量和方法阴影

java - 使用类型参数重写泛型方法时出现编译错误

java - 从过滤器重定向到 JSP 时传递属性 : Session vs Request

android - 如何在 Android 应用程序中使用 Facebook 登录按钮获取 FB 用户 ID

Android XML 值 - String Array::Placing a quote in the value?

java - 我可以从静态方法调用非静态方法吗?

swift - 在 Swift 中,是否有像 self 这样的关键字,但用于类?

java - 密码查询 : - Allow apostrope(') containing String in the query

java - 将时间戳转换为天数并返回会导致不同的日期