gpt4 book ai didi

android - 来自异步任务的上下文和回调

转载 作者:行者123 更新时间:2023-11-30 02:04:13 25 4
gpt4 key购买 nike

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

我的 Activity 有 7 个 fragment 。在大多数情况下,我启动一个 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 block 中,如果发生异常,我取消 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 没有在代码中被破坏,因为唯一发生的事情是在同一 activity 中的 fragments 之间切换。

最佳答案

getActivity()返回 null也是您应该预料到的完全有效的场景。

发生这种情况是因为通过创建匿名 Handler在你的onCreateView你在引用 Fragment已经与 Activity 分离(因此 getActivity() 返回 null )。同样适用于你的 AsyncTask - 如果您在 Fragment 中将其创建为匿名类然后它也引用相同的分离 Fragment .

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

关于android - 来自异步任务的上下文和回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30976927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com