使用Volley的最佳方法

时间:2015-07-15 08:13:59

标签: android networking android-volley

使用截击的最佳方法是什么?首先,我使用了他们所提供的截击,所以有时会抛出

java.lang.IllegalStateException because the activity has been finish till the response from volley return. 

所以我上网并找到使用事件总线的解决方案。所以我知道我正在使用事件总线,在onResume上注册一个事件,在unregister上注册onPause,在onResponse上注册已注册的事件。

但我想要一些通用且更好的方法。

PS:还有一个库做同样的事情OttoVolleyDoneRight我也不想使用它。

1 个答案:

答案 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        
    }   
}

}

干杯!