2

我有一些活动实现了一个接口(称为 NetworkListener)。当从远程服务器请求信息时,它们会产生一个类的实例(称为 NetworkRequest)。NetworkRequest 是一个线程类,它向服务器发送请求,等待响应并将其发送回请求的 NetworkListener 对象。最多可能需要 10 秒才能将数据返回到 NetworkListener 实例。在那段时间里,很有可能那个Activity或者Fragment已经不存在了,很多基于服务端调用的action已经失效,会抛出NPE,比如:

((TextView) findViewById(R.id.server_status)).setText("Server response: " + response.getMsg());

确保请求类仍然存在并能够更新 UI 的最佳方法是什么?

目前在我拥有的从服务器接收回调的每个方法的顶部:

if (getWindow() == null) {  // or getView()/getActivity() if Fragment
            finish();
            return;
        }

这似乎效率低下且多余。有没有更好的方法来完成我想要完成的事情?

谢谢!

4

2 回答 2

1

您可以将活动/片段的逻辑检查状态移动到 NetworkRequest。将 isActive() 方法添加到 NetworkListener 接口。仅当 NetworkListener 处于活动状态时,NetwrokRequest 才会向 NetworkListener 发送响应。

您可以在 onCreate() -> active 和 onDestroy() -> inactive 中设置活动/片段活动性。

请注意旋转屏幕时的活动状态变化。然后,你得到一个没有得到服务器响应的新活动,这可能不是你想要的。

于 2012-08-28T08:07:27.420 回答
0

您可以使用 AsyncTask 来执行您的网络请求。当不再需要请求时,可以取消 AsyncTask。

于 2012-08-26T13:08:43.057 回答