Как отправить последовательные запросы на получение - PullRequest
0 голосов
/ 01 марта 2012

Я хочу написать функцию, которая слушает сервер, регулярно отправляя запросы на получение.Следующий запрос не следует отправлять на сервер, пока не получен ответ от первого запроса.Чтобы смоделировать это, я пишу следующий код, который отправляет последовательный запрос get на сервер 5 раз:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.main);
    TextView tv = new TextView(this);

    for (int i = 0; i < 5; i++)
    {
        tv.setText(retrieve("http://www.mydomain.com/http.php?key=" + i));
        setContentView(tv);
    }
}

"String retrieve (String url) {...}" - это функция, которая возвращает содержимое URLв данном случае это просто число, отправляемое следующим PHP-файлом («http.php»):

<?php
sleep(1);
echo $_GET['key']+1;
?>

Хотя я помещаю 1 секунду в спящий режим, чтобы увидеть значения в моем приложении для Android, я вижу только «5"через несколько секунд.Так эти 5 запросов асинхронны или последовательны или есть другая проблема?

1 Ответ

3 голосов
/ 01 марта 2012

Код внутри метода onCreate выполняется только один раз, прежде чем вы видите что-либо, поэтому, вероятно, вы видите только 5 (последний). Кроме того, вам не следует выполнять сетевые вызовы оттуда, поскольку это на некоторое время блокирует основной поток пользовательского интерфейса и, вероятно, вызывает принудительное закрытие в вашем приложении.

Вы должны реализовать метод для запуска в фоновом режиме. Нечто похожее на это:

private int i;
public void onCreate(Bundle savedInstanceState) {
  i = 0
  new ServerRetreiveTask().execute("http://www.mydomain.com/http.php?key=" + i);
}

private class ServerRetreiveTask extends AsyncTask<String, Void, Bitmap> {
     protected Bitmap doInBackground(String urls) {
         return retrieve(url);
     }

     protected void onPostExecute(Bitmap result) {
         mImageView.setImageBitmap(result);
         if (i<5){
            i++:
            new ServerRetreiveTask().execute("http://www.mydomain.com/http.php?key=" + i);
         }
     }
 }

Прочтите этот документ для получения дополнительной информации об асинхронной задаче http://developer.android.com/resources/articles/painless-threading.html

Альтернативный способ с использованием потоков (не рекомендуется):

new Thread(new Runnable() {

            @Override
            public void run() {
                final String response;
                for (int i = 0; i < 5; i++)
                {
                    response = retrieve("http://www.mydomain.com/http.php?key=" + i);
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {

                            tv.setText(response);

                        }
                    });
                }

            }
        }).start();
...