Android 静态字段将泄漏上下文

Android 静态字段将泄漏上下文,android,class,methods,static,non-static,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.printS

这是我的启动活动代码:

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);
    }
}
如果我将类更改为静态,将使用非静态方法,并将弹出错误:

Intent homeIntent = new Intent(getApplicationContext(), ActivityHome.class);
startActivity(homeIntent);
overridePendingTransition(R.anim.open_next, R.anim.close_main);

所以如果我使用私有类将得到警告,如果我尝试使用静态类将得到错误。如何获得清晰的代码?

不要在asyntask中引用上下文。使用回调将启动新活动委托给上下文活动本身。这是一种常见的错误做法,会导致内存泄漏,因为AsyncTask可能超过上下文。这将避免将其声明为静态,并且您将只有线程安全代码。

作为非静态内部类的AsyncTask将收到对其父类活动的引用。因此,代码中会出现警告

为了更正此问题并仍然可以访问您的活动,请将您的活动作为传递到AsyncTask的构造函数中

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

在我看来,你也应该考虑远离异步任务。查看或查看现代版。

或者对于这种情况,我认为新的Handler.postDelay就足够了
Intent homeIntent = new Intent(getApplicationContext(), ActivityHome.class);
startActivity(homeIntent);
overridePendingTransition(R.anim.open_next, R.anim.close_main);