使用截击的最佳方法是什么?首先,我使用了他们所提供的截击,所以有时会抛出
java.lang.IllegalStateException because the activity has been finish till the response from volley return.
所以我上网并找到使用事件总线的解决方案。所以我知道我正在使用事件总线,在onResume
上注册一个事件,在unregister
上注册onPause
,在onResponse
上注册已注册的事件。
但我想要一些通用且更好的方法。
PS:还有一个库做同样的事情OttoVolleyDoneRight
我也不想使用它。
答案 0 :(得分:1)
你应该有一个单一的Volley实例 - 它包含那里的所有排球部分(例如RequestQueue)。您应该将此单例作为应用程序对象的一部分(或作为主要活动的一部分的事件,然后在onDestroy中销毁它)。
以下是如何创建Volley单身人士的示例: https://developer.android.com/training/volley/requestqueue.html
我不认为处理事件和截击是正确的。你应该为每个请求都有一个具体的监听器。你可以做的很简单:创建一个实现Volley Listener / ErrorListener的类(或内部静态类)并在WeakReference中保存你的活动 - 一旦调用了volley的回调,只需检查你的活动引用是否仍然存在并做你想做的事情。如果它不存在则可能已关闭(并且GC选择了WeakReference)。
这样可以避免内存泄漏(泄漏活动)并正确处理回调。
**我不知道你的应用程序在做什么,但我很确定你真的不需要在你的活动中处理网络回调,而是在你拥有的某个适配器(例如ListView)中。
将此侦听器的新实例作为回调传递给Volley。
public class MyImageListener extends implements Response.Listener<T>, Response.ErrorListener {
private WeakReference<Activity> mActivity;
private final String mUrl;
public MyImageListener(String url, Activity activity) {
mUrl = url;
mActivity = new WeakReference<>(activity);
}
@Override
public void onErrorResponse(VolleyError error) {
Activity activity = mActivity.get();
if (activity != null) {
// Activity is alive, do what you need with it
}
}
@Override
public void onResponse(T result) {
Activity activity = mActivity.get();
if (activity != null) {
// Activity is alive, do what you need with it
}
}
}
干杯!