我在onDestroy
函数中运行此代码:
@Override
protected void onDestroy() {
if (!(null == theUser.glideId)) {
JSONObject req = new JSONObject();
try {
req.put("actionKey", "UserPresenceInactive");
req.put("userId", theUser.userId);
new ServerRequest().execute(req); //Run an AsyncTask
} catch (JSONException e) {
e.printStackTrace();
}
}
super.onDestroy();
}
在AsyncTask
中,我向服务器发送请求(仅返回200响应)。
我的问题是,这样做有什么影响(如果有的话)?
活动是否被销毁?如果服务器没有响应,应用程序是否保持清醒并可能进入ANR?有什么想法吗?
修改
我试过这样做,但得到了android.os.NetworkOnMainThreadException
。
new Runnable() {
@Override
public void run() {
JSONObject req = new JSONObject();
try {
req.put("actionKey", "UserPresenceInactive");
req.put("userId", theUser.userId);
new ServerRequest().execute(req); //Run an AsyncTask
} catch (JSONException e) {
e.printStackTrace();
}
}
}.run();
更新#2
使用Thread
代替Runnable
就行了!
答案 0 :(得分:1)
是的,Activity
被破坏但AsyncTask
正在完成其工作(在后台工作)。不会有任何ANR
,因为您没有在UI上执行任何后台操作。如果您在完成AsyncTask
后更新用户界面上的任何视图,则会有NULLPOINTER Exception
AFAIK。但是,在onDestroy()
中运行AsyncTask不是一个好主意。
答案 1 :(得分:1)
最好的方法是在方法中运行AsyncTask,例如onPause()或onSaveInstanceState()而不是onDestroy()
看看开发者的android参考:
的onPause(): 此回调主要用于保存活动正在编辑的任何持久状态,向用户显示“就地编辑”模型,并确保在没有先杀死此活动的情况下没有足够的资源来启动新活动时不会丢失任何内容。这也是一个很好的做法,例如停止动画和其他消耗大量CPU的事情,以便尽快切换到下一个活动,或者关闭独占访问的资源,如摄像头。
在系统需要更多内存的情况下,它可能会终止暂停的进程以回收资源。因此,您应该确保在从此函数返回时保存所有状态。通常onSaveInstanceState(Bundle)用于保存活动中的每个实例状态,此方法用于存储全局持久数据(在内容提供者,文件等中)。