почему тег не показывает мой элемент массива?

#java #android #arrays

#java #Android #массивы

Вопрос:

это выдает мне кучу ошибок в logcat. но если я удаляю Log.d("intheclass", questionsArray.get(0)); , он не показывает ошибок и приложение не запускается. с этим кодом приложение не запускается. Я попытался зарегистрировать сам ответ, это работает. Абсолютно понятия не имею, почему этот массив не работает.

 package com.example.trivia.data;

import android.util.Log;

import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.example.trivia.controller.AppControl;

import org.json.JSONArray;
import org.json.JSONException;

import java.util.ArrayList;
import java.util.List;

public class QuestionBank {
    private String que1;
    String url = "https://raw.githubusercontent.com/curiousily/simple-quiz/master/script/statements.json";
    ArrayList<String> questionsArray= new ArrayList<String>();



    public List<String> getQuestions(){
        JsonArrayRequest bank = new JsonArrayRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        for(int i=0; i<response.length(); i  ){
                            try {
                                que1 = (String) response.getJSONArray(i).get(0);
                                Log.d("queva", String.valueOf(i));
                                questionsArray.add(que1);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }

                        }
                        //if(callback != null) callback.processFinish(questionsArray);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                });
        AppControl.getInstance().addToRequestQueue(bank);
        Log.d("intheclass", questionsArray.get(0));
        return questionsArray;
    }
}
  

Комментарии:

1. Возможно, если questionsArray заполняется асинхронно, он не будет заполнен, когда основной поток достигнет инструкции Log.d . Хотя вы, вероятно, захотите опубликовать полную ошибку, которую вы видите.

Ответ №1:

к моменту попытки доступа он пуст. Когда вы вызываете getQuestions(), он отправляется в другой рабочий поток для добавления значений в questionsArray, но ваш журнал находится в основном потоке и находится в последовательном вызове, поэтому он не будет работать и приведет к сбою.

Возможное решение.

 public void getQuestions(){
    JsonArrayRequest bank = new JsonArrayRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    for(int i=0; i<response.length(); i  ){
                        try {
                            que1 = (String) response.getJSONArray(i).get(0);
                            Log.d("queva", String.valueOf(i));
                            questionsArray.add(que1);
                            doSomething(); //here calling
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                    //if(callback != null) callback.processFinish(questionsArray);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {

                }
            });
 }
}
  

и вызовите это из onRepsonse() после успешного вызова api.

 public void doSomething(){
    AppControl.getInstance().addToRequestQueue(bank);
    Log.d("intheclass", questionsArray.get(0));
}