2013-12-23 3 views
2

정수 배열을 url의 루프에서 차례로 호출해야합니다. 아래 코드가 있으며 마지막 숫자는 여러 번 호출되지만 모든 숫자는 호출됩니다. 처음부터 건너 뛰었습니다. 어떻게이 일을하게합니까. 정말 감사드립니다. 사전에 감사합니다. 사용루프 asynctask 안드로이드는 루프의 마지막 값만 실행합니다.

String url_select = parms[0]; 

병렬 실행 당신이 실행기를 사용해야합니다

final String[] ar={"1","2","3",.............,"25"} 

       for ( j = 0; j < ar.length; j++) { 


         u="http://www.example.com/"+ar[j]; 

         JSONParser jParser=new JSONParser();   
         new MyAsyncTask().execute(u); 

       } 


    class MyAsyncTask extends AsyncTask<String, String, Void> { 

     private ProgressDialog progressDialog = new ProgressDialog(MainActivity.this); 
     InputStream inputStream = null; 
     String result = ""; 

     protected void onPreExecute() { 
      progressDialog.setMessage("Downloading your data..."); 
      progressDialog.show(); 
      progressDialog.setOnCancelListener(new OnCancelListener() { 
       public void onCancel(DialogInterface arg0) { 
        MyAsyncTask.this.cancel(true); 
       } 
      }); 
     } 

     @Override 
     protected Void doInBackground(String... params) { 

      String url_select = params[0]; 
      try { 

       HttpClient httpclient = new DefaultHttpClient(); 
       HttpResponse httpResponse = httpclient.execute(new HttpGet(url_select)); 

       // receive response as inputStream 
       inputStream = httpResponse.getEntity().getContent(); 
// 
//    // Read content & Log 
//    inputStream = httpEntity.getContent(); 
      } catch (UnsupportedEncodingException e1) { 
       Log.e("UnsupportedEncodingException", e1.toString()); 
       e1.printStackTrace(); 
      } catch (ClientProtocolException e2) { 
       Log.e("ClientProtocolException", e2.toString()); 
       e2.printStackTrace(); 
      } catch (IllegalStateException e3) { 
       Log.e("IllegalStateException", e3.toString()); 
       e3.printStackTrace(); 
      } catch (IOException e4) { 
       Log.e("IOException", e4.toString()); 
       e4.printStackTrace(); 
      } 
      // Convert response to string using String Builder 
      try { 
       BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"), 8); 
       StringBuilder sBuilder = new StringBuilder(); 

       String line = null; 
       while ((line = bReader.readLine()) != null) { 
        sBuilder.append(line + "\n"); 
       } 

       inputStream.close(); 
       result = sBuilder.toString(); 

      } catch (Exception e) { 
       Log.e("StringBuilding & BufferedReader", "Error converting result " + e.toString()); 
      } 
      return null; 
     } // protected Void doInBackground(String... params) 


     protected void onPostExecute(Void v) { 

      //parse JSON data 
      try{ 
       JSONObject jArray = new JSONObject(result); 


       // End Loop 

       this.progressDialog.dismiss(); 

      } catch (JSONException e) { 

       Log.e("JSONException", "Error: " + e.toString()); 

      } // catch (JSONException e) 
     catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 


     } // protected void onPostExecute(Void v) 

    } //class MyAsyncTask extends AsyncTask<String, String, Void> 

답변

1

. for 루프에서 asynctask를 실행하는 대신 Executor를 사용하는 것이 좋습니다.

new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "url1","url2"..); 

http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor(java.util.concurrent.Executor,에 Params ...) 사용한다 doInBackground에서

http://developer.android.com/reference/android/os/AsyncTask.html

+0

에서 URL을 전달 된 값을 받아야 여기에 하드 코딩 된 값을 사용하여 내가 URL1, URL2, URL3을 만들 수있는 방법 동적 여기에 생각 ... – jason

+0

@jason url1, url2가 그 예입니다. 동적인지 아닌지는 중요하지 않습니다. 실행 순서에 대해 신경 쓰지 않는다면 병렬 실행을 위해 Executor를 사용하는 것이 좋습니다. 주문에 대해 신경 쓰면 직렬 실행 프로그램을 사용할 수 있습니다. – Raghunandan

+0

awesome + 1.Thanks – jason

2

@ 실행

확인하기 위해

url_select = params[0]; 

대신 url_select = 유 ; (작업을 실행할 때 실제로 u 값을 알 수 없도록 비동기 적으로 작업을 실행하는 동안 for 루프에 u를 할당하면 마지막으로 할당 된 값이 유지됩니다.)

+0

이 작업을 수행 할 것입니다 \t "new MyAsyncTask(). execute (u);" – jason

+0

그 전화가 맞습니다. 실행하기 위해 전달한 매개 변수는 doInBackground에서 param [0] – jpm

1

String url_select = u;

나는 문제가 당신이 params

String url_select = params[0];

+0

으로 사용할 수 있습니다.이 호출은 \t new myAsyncTask(). execute (u); – jason

+0

예 –

관련 문제