Request Queue in volley 不能应用于 View Model
Request Queue in volley cannot be applied to View Model
我正在尝试将我的 JSON 数据加载到扩展 android 视图模型的视图模型 class 中,但我无法获取请求队列的上下文
观察者使用 android 视图模型扩展的视图模型 class 将产品列表加载到产品适配器 onChanged 方法
这是我的视图模型class代码
public class ProductViewModel extends AndroidViewModel {
private MutableLiveData<List<Product>> productLiveData;
private List<Product> productList;
private Application application;
private JsonArrayRequest productJsonArrayRequest;
public ProductViewModel(@NonNull Application application) {
super(application);
}
public MutableLiveData<List<Product>> getProductLiveData () {
if(productLiveData == null) {
productLiveData = new MutableLiveData<>();
initialize();
}
return productLiveData;
}
private void initialize(){
productJsonRequest();
productLiveData.setValue(productList);
}
private void productJsonRequest() {
productList = new ArrayList<>();
JsonArrayRequest productsJsonArrayRequest = new JsonArrayRequest(Config.FETCH_PRODUCTS, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
JSONObject jsonObject;
for (int i = 0; i < response.length(); i++) {
try {
jsonObject = response.getJSONObject(i);
Product product = new Product();
product.setId(jsonObject.getInt("id"));
product.setName(jsonObject.getString("name"));
product.setPrice(jsonObject.getDouble("price"));
product.setStock(jsonObject.getInt("stock"));
product.setCategoryId(jsonObject.getInt("categoryId"));
product.setCategory(jsonObject.getString("category"));
product.setPhoto(jsonObject.getString("photo"));
productList.add(product);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
RequestQueue productRequestQueue = Volley.newRequestQueue(this);
productRequestQueue.add(productsJsonArrayRequest);
}
}
问题就在这里
RequestQueue productRequestQueue = Volley.newRequestQueue(this);
Volley.newRequestQueue() 需要传入上下文。您使用的关键字 "this" 指的是视图模型 class 而不是上下文。这很容易修复,只需将其更改为:
RequestQueue productRequestQueue = Volley.newRequestQueue(getApplication());
我正在尝试将我的 JSON 数据加载到扩展 android 视图模型的视图模型 class 中,但我无法获取请求队列的上下文
观察者使用 android 视图模型扩展的视图模型 class 将产品列表加载到产品适配器 onChanged 方法
这是我的视图模型class代码
public class ProductViewModel extends AndroidViewModel {
private MutableLiveData<List<Product>> productLiveData;
private List<Product> productList;
private Application application;
private JsonArrayRequest productJsonArrayRequest;
public ProductViewModel(@NonNull Application application) {
super(application);
}
public MutableLiveData<List<Product>> getProductLiveData () {
if(productLiveData == null) {
productLiveData = new MutableLiveData<>();
initialize();
}
return productLiveData;
}
private void initialize(){
productJsonRequest();
productLiveData.setValue(productList);
}
private void productJsonRequest() {
productList = new ArrayList<>();
JsonArrayRequest productsJsonArrayRequest = new JsonArrayRequest(Config.FETCH_PRODUCTS, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
JSONObject jsonObject;
for (int i = 0; i < response.length(); i++) {
try {
jsonObject = response.getJSONObject(i);
Product product = new Product();
product.setId(jsonObject.getInt("id"));
product.setName(jsonObject.getString("name"));
product.setPrice(jsonObject.getDouble("price"));
product.setStock(jsonObject.getInt("stock"));
product.setCategoryId(jsonObject.getInt("categoryId"));
product.setCategory(jsonObject.getString("category"));
product.setPhoto(jsonObject.getString("photo"));
productList.add(product);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
RequestQueue productRequestQueue = Volley.newRequestQueue(this);
productRequestQueue.add(productsJsonArrayRequest);
}
}
问题就在这里
RequestQueue productRequestQueue = Volley.newRequestQueue(this);
Volley.newRequestQueue() 需要传入上下文。您使用的关键字 "this" 指的是视图模型 class 而不是上下文。这很容易修复,只需将其更改为:
RequestQueue productRequestQueue = Volley.newRequestQueue(getApplication());