Arraylist, которые иногда содержат данные, а иногда нет - PullRequest
0 голосов
/ 05 сентября 2018

Новичок здесь.

Я работаю в приложении для Android, и со мной происходит цикл странных событий. Я делаю серию запросов к базе данных с библиотекой залпа, и она хорошо возвращает данные. Нет проблем.

Проблема, я думаю, заключается в последней функции DameColorPlato (), потому что иногда код обращается к циклу while и проходит через него хорошо, а иногда нет, и возвращает значение по умолчанию для переменной CC ( # 000000) и это не очень хорошо показывает цвета текста.

Это мой код (в итоге):

 protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_menu);

     Bundle datos = getIntent().getExtras();
     id_usuario = datos.getString("id_usuario");
     idCentro = datos.getString("id_centro");
     fecha_actual = datos.getString("fechaActual");
     fecha_actual_SQL = datos.getString("fechaActualSQL");


         plato1 = (TextView)findViewById(R.id.textView4);
         plato2 = (TextView)findViewById(R.id.textView3);



         ObtPlatos_volley(idCentro, fecha_actual_SQL);

         ObtColores_volley();


     public void ObtPlatos_volley(final String id_centro, final String fecha_actual_SQL){


         String url = "http://neton.es/WS_neton/menu_dia.php?id_centro="+id_centro+"&fecha_actual_SQL="+fecha_actual_SQL;

         StringRequest eventfulRequest = new StringRequest(Request.Method.GET, url,
                 new Response.Listener<String>() {
                     @Override
                     public void onResponse(String response) {
                         try {

                             JSONArray jsonArray = new JSONArray(response);

                             for (int i=0; i<jsonArray.length(); i++) {


                                 platouno = jsonArray.getJSONObject(i).getString("plato1");
                                 platodos = jsonArray.getJSONObject(i).getString("plato2");



                                 platounoColor = jsonArray.getJSONObject(i).getInt("tipo1");
                                 platodosColor = jsonArray.getJSONObject(i).getInt("tipo2");


                             }


                                 plato1.setText(platouno);

                                 String co1 = DameColorPlato(CodTipoPlato, ColorLetra, platounoColor);

                                 plato1.setTextColor(Color.parseColor(co1));



                                 plato2.setText(platodos);

                                 String co2 = DameColorPlato(CodTipoPlato, ColorLetra, platodosColor);

                                 plato2.setTextColor(Color.parseColor(co2));



                         } catch (Exception e) {
                             e.printStackTrace();

                         }
                     }
                 },
                 new Response.ErrorListener() {
                     @Override
                     public void onErrorResponse(VolleyError error) {
                         Log.e("Error: ", error.toString());
                     }
                 });

         VolleySingleton.getInstance(this)
                 .addToRequestQueue(eventfulRequest);
     }



     public void ObtColores_volley(){

         String url = "http://neton.es/WS_neton/color_platos.php";

         StringRequest eventfulRequest = new StringRequest(Request.Method.GET, url,
                 new Response.Listener<String>() {
                     @Override
                     public void onResponse(String response) {
                         try {

                             int cod_color_letra;
                             String color_letra;


                             JSONArray jsonArray = new JSONArray(response);

                             for (int i=0; i<jsonArray.length(); i++){

                                 cod_color_letra = jsonArray.getJSONObject(i).getInt("cod_tipoplato");
                                 color_letra = jsonArray.getJSONObject(i).getString("color");

                                 CodTipoPlato.add(cod_color_letra);
                                 ColorLetra.add(color_letra);
                             }

                         } catch (Exception e) {
                             e.printStackTrace();

                         }
                     }
                 },
                 new Response.ErrorListener() {
                     @Override
                     public void onErrorResponse(VolleyError error) {
                         Log.e("Error: ", error.toString());
                     }
                 });

         VolleySingleton.getInstance(this)
                 .addToRequestQueue(eventfulRequest);
     }



     public String DameColorPlato(ArrayList<Integer> CodColorL, ArrayList<String> ColorL, int tipoplato){

         String CC="#000000";
         int i=0;
         boolean encontrado=false;


     while (i < CodColorL.size() && !encontrado) {

         if (tipoplato == CodColorL.get(i)) {

             CC = ColorL.get(i);

             encontrado = true;

         }else {
             i++;
         }

     }
         return CC;
     } 
}

С помощью тоста я обнаружил, что переменные ArrayList CodColorL и ArrayList ColorL иногда идут со значениями, а иногда они бывают пустыми. Но я не могу найти ошибку.

Заранее спасибо!

(извините за мой плохой английский)

1 Ответ

0 голосов
/ 05 сентября 2018

Как я объяснил в комментариях, для всех, кто рассматривает этот вопрос, причина, по которой OP обнаружил проблему ненадежных данных, заключается в том, что они делают два Volley запроса и ожидают, что один из них завершится раньше, неявно.

По умолчанию запросы залпа выполняются в очереди, но имеют значение Asynchronous, что означает, что запросы не обязательно завершатся в том порядке, в котором они были запущены в очереди. Поскольку один запрос OP зависит от данных другого, правильный способ сделать это - синхронно выполнить запросы. Это можно сделать несколькими способами, например, используя обратный вызов из первого запроса или запустив второй запрос в блоке onResponse первого.

Еще один способ добиться того же - создать собственную архитектуру выполнения запросов, в которой у вас есть способ выполнить все запросы в одном потоке, но это слишком оптимизация для данного конкретного случая.

...