2012-03-01 3 views
0

Я хочу написать функцию, которая прослушивает сервер, отправляя запросы на запросы повторно. Следующий запрос не следует отправлять на сервер до получения ответа от первого запроса. Для имитации этого, я пишу следующий код, который посылает запрос подряд получить к серверу 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 URL) {...}» является функция, которая возвращает содержание URL, в этом случае просто номер прислал следующий файл PHP («http.php»):

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

Хотя я поставил 1 секунду сна, чтобы увидеть значения на моем андроид приложение, единственное, что я вижу, это «5» через несколько секунд , Так эти 5 запросов asyn или они последовательны или есть другая проблема?

ответ

3

Код внутри метода 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(); 
+0

но я хочу, чтобы это было synchoronus, я средний, второй запрос не должен быть отправлен до получения первого ответа от сервера (я прав?). Таким образом, это петля вроде этого ОК? – Mehmed

+0

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

+0

Спасибо за решение, это лучший способ, как вы сказали ... Мне также интересно ваше мнение о прослушивании сервера? Я думаю, что это http-получение не является реальным решением. – Mehmed

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