我在某些设备上遇到过这个问题,特别是三星。
我的活动有7 fragments
。在大多数情况下,我开始async
任务来获取一些数据。我通过在o nCreateView()
中创建处理程序来处理异常。
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()
回调中通知处理程序。< / p>
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
没有返回任何内容,好像fragments
已被销毁,再也没有被创建。问题是代码中的活动没有被破坏,因为只有正在发生的事情是在同一activity
<form:option value=''>
之间切换。
答案 0 :(得分:1)
getActivity()
返回null
是一个完全有效的方案,您也应该期待。
这是因为在您的Handler
中创建了匿名onCreateView
,您引用了Fragment
Activity
已经与getActivity()
分离(因此null
返回AsyncTask
)。您的Fragment
也是如此 - 如果您在Fragment
内创建匿名类,那么它也会引用相同的分离LoaderManager
。
我建议你修改你的架构。怎么样?我相信,您的UI组件不应该自己执行异步操作。相反,您应该使用任何类型的发布/订阅机制(有些解决方案使用HandlerThread
,PerilCode B C BI
EQ 179166451986 27296144046 9067728654
WS 182394050346 28745459712 9148728654
SL 114374574342 12703142574 293860386
TC 182394050346 28745459712 9148728654
WF 182394050346 28745459712 9148728654
FF 182394050346 28745459712 9148728654
ST 182394050346 28745459712 9148728654
,RxJava,RoboSpice和其他第三方库。)