我正在阅读AsyncTask
的内容。这对我来说是可以理解的,但我脑子里立刻想出了两个问题:
假设我有一个类和一个接口:
public MyInterface<T>
{
void done(T result);
}
public MyActivity extends Activity implements MyInterface<String>
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
R.getViewByID(R.....);
//...
beginTask(urls);
}
private void beginTask(URL[] urls)
{
ATask task = new ATask(this);
task.execute(urls);
}
@Override
void done()
{
System.out.println("done!");
}
}
AsyncTask
类:
public ATask extends AsyncTask<URL, Void, String>
{
MyInterface<String> handler = null;
private StringBuilder fetchedResult = new StringBuilder();
ATask(MyInterface<T> handler)
{
this.handler = handler;
}
@Override
protected String doInBackGround(URL urls...)
{
URL url = urls[0];
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url.toString());
ResponseHandler<String> handler = new BasicResponseHandler<String>();
String result = null;
try
{
result = client.execute(request, handler);
fetchResult.append(result);
}
catch(IOException e)
{
e.printStackTrace();
}
catch(ClientProtocolException e)
{
e.printStackTrace();
}
finally
{
client.getConnectionManager().shutdown();
}
return fetchResult.toString();
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
handler.done(result);
}
}
一切都很好。但是我遇到的担忧是:
1。)
如果由于某些原因调用
Activity
的{{1}}(MyActivity
)会怎样 (AsyncTask
)被破坏,ATask
完成,然后调用done();在被破坏的活动中?我们怎么能阻止 这种情况发生或有没有办法重新创建被破坏的ATask
?这里最好的做法是什么?2。)
另一种情况:如果后台任务需要很长时间(即使有意),该怎么办?
Activity
中的应用程序已不在视图中?它会不会继续坚持下去 为了内存的原因(即,当需要调用onStop()时)应该销毁Activity(MyActivity),这个Activity(MyActivity)的引用时间很长?
答案 0 :(得分:1)
在这两种情况下,您都必须覆盖应用程序onDestroy或activity onStop方法并调用task.cancel()。所以你需要继续引用你的任务对象。
答案 1 :(得分:0)
1。)根据文件:
onStop()
- &gt;当活动不再对用户可见时调用,因为另一个活动已经恢复并且正在覆盖此活动。
ondestroy()
- &gt;在您的活动被销毁之前收到的最后一个电话。这可能是因为活动正在完成(有人称为finish(),或者因为系统暂时销毁此活动实例以节省空间
因此,您需要决定何时致电task.cancel()
,这可能取决于您的业务逻辑。
2。)根据文档AsyncTask
应该用于仅运行几秒钟的操作。每当AsyncTask
/ Thread
正在运行且您的活动被破坏时,内存就会泄露,因为它们仍然保留您的活动的引用。为避免任何泄漏,请将AsyncTask
/ Thread
声明为私有静态内部类,并在onDestroy()
中将t.close
关闭您的主题,如果是AsyncTask
将您的活动设置为null
mActivity = null
,因此在这两种情况下,您的活动现在都有资格进行垃圾回收。