2015-02-28 3 views
0

У меня проблема с петлей. По-моему, это должно сработать, но проходит через петлю. Мне нужно проверить сервер доступности, и у меня нет других идей.Как выполнить петлю с волейболом

сервер дать ответ:

{ "существует": истинно}

 do { 
     generateNumber = generate(); 
     getExsistResponse = "http://skidd.herokuapp.com/exist/" + generateNumber; 


      final StringRequest request = new StringRequest(Request.Method.GET, getExsistResponse, new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        existObject exist = new Gson().fromJson(response, existObject.class); 
        exist.getExist(); 
        String abcd = exist.getExist(); 
        Boolean boolean1 = Boolean.valueOf(abcd); 

        if (boolean1) { 
         Log.i("Info", "Pokój: " + abcd); 
         textView.setText("" + boolean1); 
         Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show(); 

        } else { 
         textView.setText("" + boolean1); 
         Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show(); 
        } 

       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        //When an error 
       } 
      }); 
      ConnectionManager.getInstance(this).add(request); 
      //Add the request to the RequestQueue. 
     }while (boolean1); 

и вот мой existObject класс:

public class existObject { 

@SerializedName("exist") 
private String checkexist; 

public String getExist() { 
    return checkexist; 
} 
public void getExist(String name) { 
    this.checkexist = name; 
} 

}

ответ

1

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

Поймите: звонок в веб-службу асинхронный. Вы просто не можете предсказать, сколько времени потребуется для завершения, и время, необходимое для завершения каждого вызова веб-сервиса, всегда будет меняться. С другой стороны, ваш цикл do-while равен synchronous: он продолжает создавать объекты StringRequest и добавляет их в RequestQueue, и эти запросы не выполняются немедленно, поэтому значение boolean1 может быть правильно настроено или не установлено следующая итерация цикла do-while.

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

  • Создание AsyncTask и выполнить HttpURLConnection запрос (и не Volley Request) в своем doInBackground(), и установите значение из boolean1 там.
  • Если значение boolean1 является true, а затем создать новый экземпляр тот же AsyncTask в onPostExecute() и вызвать execute() к начать следующий вызов веб-службы.
+0

Да, это так, спасибо! –

+0

но все же я понятия не имею, как это сделать –

+0

@ Xedi: Я предложил подход. Вы знаете, как использовать 'AsyncTask'? Если нет, то сначала изучите некоторые примеры того, как работает «AsyncTask» и как делать вызовы веб-сервисов с ним –

Смежные вопросы