2012-03-01 8 views
0

get 요청을 reqularly 보내서 서버를 수신하는 함수를 작성하고 싶습니다. 첫 번째 요청에서 응답을받을 때까지 다음 요청을 서버에 보내면 안됩니다. 이 시뮬레이션하기 위해, 나는 5 번 서버에 연속 GET 요청을 전송하는 다음 코드를 작성 :연속적인 get 요청을 보내는 방법

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); 
    } 
} 

"문자열 검색 (문자열 URL) {...}"이 경우, URL의 내용을 반환하는 기능입니다 다음 PHP 파일 ("http.php")에 의해 전송 된 단지 수 :

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

내 안드로이드 응용 프로그램에 값을 보려면 1 초 잠을 넣어하지만, 내가 볼 수있는 유일한 것입니다 "5"몇 초 후에 . 그래서이 5 가지 요청은 asyn입니까, 아니면 연속적입니까, 아니면 또 다른 문제입니까?

답변

3

onCreate 메서드 내의 코드는 한 번만 실행되기 전에 실행됩니다. 그 이유는 아마도 5 (마지막 코드) 만 볼 수있는 이유 일 것입니다. 또한 잠시 동안 UI 메인 스레드를 차단하고 아마도 앱에서 강제 종료를 유발할 것이므로 네트워크 호출을해서는 안됩니다.

백그라운드에서 실행하는 방법을 구현해야합니다. 이 비슷한 :

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되고 싶어요를, I 평균, 두 번째 요청은 서버로부터 첫 번째 응답이 수신 될 때까지 전송되어서는 안됩니다 (맞습니까?). 따라서 이와 같은 루프가 정상입니까? – Mehmed

+0

내가 준 옵션이 좋습니다. 코드를 읽으면 onPostExecute 메소드를 볼 수 있습니다. 이것은 요청이 완료되면 호출되므로 원하는대로 작동합니다. Threads를 사용하여 루프를 반복 할 수도 있습니다. –

+0

해결책을 제공해 주셔서 감사합니다. 말씀 드린대로 최선의 방법입니다. 서버 수신에 대한 귀하의 아이디어가 궁금하십니까? 나는이 http가 진짜 해결책이 아니라고 생각한다. – Mehmed

관련 문제