我有一些Activity实现了一个接口(称为NetworkListener)。从远程服务器请求信息时,它们会生成一个类的实例(称为NetworkRequest)。 NetworkRequest是一个线程类,它将请求发送到服务器,等待响应并将其发送回请求的NetworkListener对象。将数据返回到NetworkListener实例可能需要10秒钟。在此期间,很可能该Activity或Fragment不再存在,并且很多操作都基于服务器调用 不再有效,会抛出NPE,例如:
((TextView) findViewById(R.id.server_status)).setText("Server response: " + response.getMsg());
确保请求类仍处于活动状态且能够更新UI的最佳方法是什么?
目前在接收来自服务器的回调的每个方法的顶部,我有:
if (getWindow() == null) { // or getView()/getActivity() if Fragment
finish();
return;
}
这似乎效率低下且多余。对我想要完成的事情有没有更好的方法?
谢谢!
答案 0 :(得分:1)
您可以将activity / fragment的逻辑检查状态移动到NetworkRequest。将isActive()方法添加到NetworkListener接口。 仅当后者处于活动状态时,NetwrokRequest才会向NetworkListener发送响应。
您可以在onCreate() - >中设置活动/片段活动性active和onDestroy() - >不活动的。
请注意旋转屏幕时的活动状态更改。然后,你得到一个新的活动,它没有得到服务器的响应,这可能不是你想要的。
答案 1 :(得分:0)
您可以使用AsyncTask来执行网络请求。当不再需要请求时,可以取消AsyncTask。