3

我在我的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 响应)。

我的问题是,这样做有什么影响(如果有的话)?

Activity 会被销毁吗?如果服务器没有响应,应用程序是否保持唤醒状态并可能进入 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

使用 aThread而不是 aRunnable成功了!

4

2 回答 2

1

是的,它Activity被摧毁了,但它AsyncTask正在做它的工作(在后台工作)。不会有ANR,因为您没有在 UI 上做任何背景工作。如果您在AsyncTask完成后更新 UI 上的任何视图,那么会有一个NULLPOINTER ExceptionAFAIK。但是,在onDestroy().

于 2012-06-28T10:57:09.800 回答
1

最好的方法是在 onPause() 或 onSaveInstanceState() 等方法中运行 AsyncTask,而不是在 onDestroy()

查看开发者android参考:

OnPause():此回调主要用于保存活动正在编辑的任何持久状态,向用户呈现“就地编辑”模型,并确保在没有足够资源启动新活动的情况下不会丢失任何内容杀了这个。这也是一个很好的地方来做一些事情,比如停止动画和其他消耗大量 CPU 的事情,以便尽快切换到下一个活动,或者关闭诸如相机之类的独占访问资源。

在系统需要更多内存的情况下,它可能会终止暂停的进程以回收资源。因此,您应该确保在您从此函数返回时保存所有状态。通常 onSaveInstanceState(Bundle) 用于在活动中保存每个实例的状态,此方法用于存储全局持久数据(在内容提供程序、文件等中)

于 2012-06-28T11:05:51.393 回答