静态字段将泄漏上下文

时间:2018-05-07 13:39:13

标签: android class methods static non-static

这是我的启动活动代码:

public class Loading extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... voids) {
        try {
            Thread.sleep(4000);
        }catch(InterruptedException ie){
            ie.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        Intent homeIntent = new Intent(getApplicationContext(), ActivityHome.class);
        startActivity(homeIntent);
        overridePendingTransition(R.anim.open_next, R.anim.close_main);
    }
}

所有工作正常但下一个警告显示:

This AsyncTask class should be static or leaks might occur (myapp.activities.ActivitySplash.Loading) less... (Ctrl+F1) 
A static field will leak contexts.

如果我将类更改为静态,则将使用非静态方法,并弹出错误:

Intent homeIntent = new Intent(getApplicationContext(), ActivityHome.class);
startActivity(homeIntent);
overridePendingTransition(R.anim.open_next, R.anim.close_main);
因此,如果我将使用私有类将获得警告,如果将尝试使用静态类将获得错误。怎么做才能有清晰的代码?

2 个答案:

答案 0 :(得分:1)

AsyncTask作为非静态内部类将接收对其父类Activity的引用。因此代码中出现警告。

要更正此操作并仍然可以访问您的活动,请将您的活动weak reference传递到AsyncTask的构造函数中。

然后,您可以在onPostExecute中调用您的意图代码,并检查您的活动是否仍然存在于内存中。

在我看来,你也应该考虑离开AsyncTask。查看RxJava或现代JobScheduler

答案 1 :(得分:0)

不要在Asyntasks中持有对上下文的引用。使用回调将新活动委托给上下文活动本身。这是一种常见的不良做法,会导致内存泄漏,因为AsyncTask可以比上下文更长久。这将避免将其声明为静态,并且您将只有线程安全代码。