Используйте Volley Singleton из ViewModel - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть новый фрагмент с ViewModel, созданный в Android Studio 3.2.1.

Цель состоит в том, чтобы сделать запрос с использованием Volley Singleton, предложенного Google здесь .

Проблема заключается в том, что шаблон Google Singleton для Volley Singleton зависит от контекстакоторого нет непосредственно в ViewModel.

Как получить контекст приложения из ViewModel, который затем будет использоваться синглтоном Volley?

WebsiteRestApi Singleton с Volley

package com.developer.pochttp.sampledata

import android.content.Context
import android.graphics.Bitmap
import android.support.v4.util.LruCache
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.toolbox.ImageLoader
import com.android.volley.toolbox.Volley

class WebsiteRestApi constructor(context: Context) {
    companion object {
        @Volatile
        private var INSTANCE: WebsiteRestApi? = null
        fun getInstance(context: Context) =
            INSTANCE ?: synchronized(this) {
                INSTANCE ?: WebsiteRestApi(context).also {
                    INSTANCE = it
                }
            }
    }
    val imageLoader: ImageLoader by lazy {

        ImageLoader(requestQueue,
            object : ImageLoader.ImageCache {
                private val cache = LruCache<String, Bitmap>(20)
                override fun getBitmap(url: String): Bitmap? {
                    return cache.get(url)
                }
                override fun putBitmap(url: String, bitmap: Bitmap) {
                    cache.put(url, bitmap)
                }
            })
    }
    val requestQueue: RequestQueue by lazy {
        // applicationContext is key, it keeps you from leaking the
        // Activity or BroadcastReceiver if someone passes one in.
        Volley.newRequestQueue(context.applicationContext)
    }
    fun <T> addToRequestQueue(req: Request<T>) {
        requestQueue.add(req)
    }
}

ViewModel

package com.developer.pochttp.ui.main

import android.arch.lifecycle.ViewModel

class MainViewModel : ViewModel() {


}

1 Ответ

0 голосов
/ 27 ноября 2018

Просто создайте класс Application, например:

public class MyApplication extends Application {
   private static MyApplication mInstance;
     @Override
     public void onCreate() {
       super.onCreate();
        mInstance = this;
     }
   public static synchronized MyApplication getInstance() {
      return mInstance;
   } 

  public static Context getAppContext() {
     return mInstance.getApplicationContext();
  }
} 

Редактирование файла Manifest.xml

  <application
    android:name=".MyApplication"
  ></application>

Вы можете предоставить залп контекст приложения, которого достаточно для работы залпа.так что теперь

VolleySingleton.getInstance(MyApplication.getAppContext());  

может сделать ваш залп работоспособным из любого места.

...