【问题标题】:Contexts and callbacks from asynchronous tasks来自异步任务的上下文和回调
【发布时间】:2015-06-22 09:52:23
【问题描述】:

我在某些设备上遇到过这个问题,尤其是三星。

我有一个包含 7 个fragments 的活动。在大多数情况下,我会启动一个async 任务来获取一些数据。我通过在 onCreateView() 中创建处理程序来处理异常。

 handler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                if (msg.what == 0) {
                    Toast.makeText(getActivity().getApplicationContext(), getActivity().getResources().getString(R.string.connection_timed_out), Toast.LENGTH_SHORT).show();
                    return true;
                }
                return false;
            }
        });

在进行API 调用时,在catch 块中,如果发生异常,我会取消async 任务并在onCancelled() 回调中通知处理程序。

new AsyncTask<Void, Void, ArrayList<UserProfile>>() {
            @Override
            protected ArrayList<UserProfile> doInBackground(Void... params) {
                try {
          return new APIService().GetUserProfiles(EnloopApplication.getCurrent().getAuthenticationToken(), thisUserProfile.getEnloop_friends());
            } catch (WampNetworkException e) {
                cancel(true);
                e.printStackTrace();
            } catch (WampApiException e) {
                e.printStackTrace();
            } catch (SocketTimeoutException e) {
                cancel(true);
            }
            return null;
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
            handler.sendEmptyMessage(0);
        }

在大多数设备上,它可以工作,但在Samsung 设备上,有时我会得到null pointer exception,因为getActivity() 没有返回任何内容,就好像activity 被销毁并且再也没有被创建一样。问题是活动没有在代码中被破坏,因为唯一发生的事情是在同一 activity 中的 fragments 之间切换。

【问题讨论】:

    标签: android android-fragments asynchronous


    【解决方案1】:

    getActivity() 返回null 是一个完全有效的场景,您也应该期待它。

    发生这种情况是因为通过在您的 onCreateView 中创建匿名 Handler,您引用了已与 Activity 分离的 Fragment(因此 getActivity() 返回 null)。您的 AsyncTask 也是如此 - 如果您将其创建为 Fragment 内的匿名类,那么它也引用相同的分离 Fragment

    我建议你修改你的架构。如何?我相信,你的 UI 组件不应该自己执行异步操作。相反,您应该使用任何类型的发布/订阅机制(有些解决方案使用LoaderManagerHandlerThread、RxJava、RoboSpice 和其他第三方库)。

    【讨论】:

    • 谢谢 :) 正在考虑使用 Retrofit,因为它包含 Rxjava
    • @Alex 正如你想象的那样,有很多方法可以避免它,它们各有优缺点。就个人而言,我更喜欢 RxJava + MVP 模式。你可以(更好)谷歌一下,已经有很多文章和例子了。
    • 会读一些关于这些的:) 谢谢你的有用见解
    猜你喜欢
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多