这是我的启动活动代码:
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);
因此,如果我将使用私有类将获得警告,如果将尝试使用静态类将获得错误。怎么做才能有清晰的代码?
答案 0 :(得分:1)
AsyncTask
作为非静态内部类将接收对其父类Activity
的引用。因此代码中出现警告。
要更正此操作并仍然可以访问您的活动,请将您的活动weak reference传递到AsyncTask
的构造函数中。
然后,您可以在onPostExecute
中调用您的意图代码,并检查您的活动是否仍然存在于内存中。
在我看来,你也应该考虑离开AsyncTask
。查看RxJava或现代JobScheduler。
答案 1 :(得分:0)
不要在Asyntasks中持有对上下文的引用。使用回调将新活动委托给上下文活动本身。这是一种常见的不良做法,会导致内存泄漏,因为AsyncTask可以比上下文更长久。这将避免将其声明为静态,并且您将只有线程安全代码。