Как использовать Volley во фрагментах в Android? - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь реализовать запрос GET, используя Volley.У меня есть кнопка «Применить» в PlacementActivity, которая направляет пользователя на PlacementHomeActivity с фрагментами.Я реализовал запрос GET в Apply.OnClickListener, и данные, полученные из запроса, должны быть показаны в PlacementHomeActivity.Но я получаю пустую объектную ошибку в этой строке:

            SingletonRequestQueue.getInstance(PlacementActivity.context).addToRequestQueue(ArrayRequest);

(Этот код работал нормально, когда вместо фрагментов использовался Activity)

Это код класса Apply.OnClickListener:

Apply.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        applyList = new ArrayList<Company>();
        JsonArrayRequest ArrayRequest = new JsonArrayRequest(Request.Method.GET, applyCompaniesUrl,
                null,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        try {
                            for (int i = 0; i < response.length(); i++) {
                                JSONObject companies = response.getJSONObject(i);
                                String id = companies.getString("id");
                                JSONObject company = companies.getJSONObject("company");
                                Company company = new Company(id, company);
                                applyList.add(company);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        Intent applyListIntent = new Intent(PlacementActivity.this,
                                PlacementHomeActivity.class);
                        startActivity(applyListIntent);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(PlacementActivity.this, error.toString(), Toast.LENGTH_LONG).show();
                        StringWriter writer = new StringWriter();
                        error.printStackTrace(new PrintWriter(writer));
                        String s = writer.toString();
                    }
                }) {
            @Override
            public Map<String, String> getHeaders() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("Cookie", "remember_user_token=" + userToken);
                return params;
            }
        };
        SingletonRequestQueue.getInstance(PlacementActivity.context).addToRequestQueue(ArrayRequest);
    }
});

Это класс SingletonRequestQueue:

public class SingletonRequestQueue {

public static SingletonRequestQueue mInstance;
private RequestQueue mRequestQueue;
private static Context appContext;
public Context context;

private SingletonRequestQueue(Context context){
    appContext = context;
    mRequestQueue = getRequestQueue();
}

public static synchronized SingletonRequestQueue getInstance(Context context){
    if(mInstance==null) {
        mInstance = new SingletonRequestQueue(context);
    }
    return mInstance;
}

public RequestQueue getRequestQueue(){
    if(mRequestQueue==null){
        mRequestQueue = new Volley().newRequestQueue(appContext.getApplicationContext());
    }
    return mRequestQueue;
}

public <T> void addToRequestQueue(Request<T> request){
    getRequestQueue().add(request);
}
}

Как исправить эту ошибку?

1 Ответ

0 голосов
/ 17 октября 2018

Это похоже на проблему контекста, попробуйте заменить PlacementActivity.context на getApplicationContext ()

SingletonRequestQueue.getInstance(Context.getApplicationContext()).addToRequestQueue(ArrayRequest);
...