Volley requestQueue в Singleton возвращает ноль - PullRequest
0 голосов
/ 05 февраля 2020

Я делаю сетевой запрос с Volley и использую его, но он работал очень хорошо, пока внезапно не начал выдавать исключение нулевого указателя на requestQueue.

class VolleySingleton(context: Context) {

    companion object{
        @Volatile
        private var newInstance: VolleySingleton? = null

        fun getInstance(context: Context) =
                newInstance
                    ?: synchronized(this){
                    newInstance
                        ?: VolleySingleton(context).also{
                        newInstance = it
                    }
                }
    }

    private val requestQueue: RequestQueue by lazy{
        Volley.newRequestQueue(context) // throws NullPointer exception
    }

    fun<T> addToRequestQueue(req: Request<T>){
        requestQueue.add(req)
    }
}

Я попытался инициализировать его следующим образом

private val requestQueue: RequestQueue =
        Volley.newRequestQueue(context) // throws NullPointer exception

но все равно работать не будет.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Вы должны использовать context.getApplicationContext() вместо context.

// Add a request (in this example, called stringRequest) to your RequestQueue.
VolleySingleton.getInstance(context.getApplicationContext()).addToRequestQueue(request)
0 голосов
/ 05 февраля 2020

Я делаю это в классе Application, который является глобальным и остается в области действия в течение всего сеанса приложения. Это в Java, но вы можете увидеть что-то, что я делаю, а вы нет.

public class MyApplication extends Application {

    /**
     * Log or request TAG
     */
    public static final String TAG = "MyApp";

    /**
     * Global request queue for Volley
     */
    private RequestQueue mRequestQueue;

    /**
     * A singleton instance of the application class for easy access in other places
     */
    private static MyApplication sInstance;

    @Override
    public void onCreate() {

        super.onCreate();

        // initialize the singleton
        sInstance = this;

    }

    /**
     * @return MyApplication singleton instance
     */
    public static synchronized MyApplication getInstance() {
        return sInstance;
    }

    /**
     * @return The Volley Request queue, the queue will be created if it is null
     */
    public RequestQueue getRequestQueue() {
        // lazy initialize the request queue, the queue instance will be
        // created when it is accessed for the first time
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(getApplicationContext());
        }

        return mRequestQueue;
    }


    /**
     * Adds the specified request to the global queue, if tag is specified
     * then it is used else Default TAG is used.
     * 
     * @param req
     * @param tag
     */
    public <T> void addToRequestQueue(Request<T> req, String tag) {
        // set the default tag if tag is empty
        req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);

        VolleyLog.d("Adding request to queue: %s", req.getUrl());

        getRequestQueue().add(req);
    }

    /**
     * Adds the specified request to the global queue using the Default TAG.
     * 
     * @param req
     * @param tag
     */
    public <T> void addToRequestQueue(Request<T> req) {
        // set the default tag if tag is empty
        req.setTag(TAG);

        getRequestQueue().add(req);
    }

    /**
     * Cancels all pending requests by the specified TAG, it is important
     * to specify a TAG so that the pending/ongoing requests can be cancelled.
     * 
     * @param tag
     */
    public void cancelPendingRequests(Object tag) {
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(tag);
        }
    }

}

Затем вы вызываете это в другом коде Activity после создания объекта запроса:

MyApplication.getInstance().addToRequestQueue(postRequest);
...