2013-12-23 2 views
2

У меня есть массив целых чисел, которые нужно вызывать один за другим в цикле из url. У меня есть код ниже, и он вызывает последнее число несколько раз, но все числа с самого начала пропущен. Как я могу заставить это работать. Я действительно ценю любую помощь. Спасибо в Advance.loop asynctask android выполняет только последнее значение в цикле

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

Использование

String url_select = parms[0]; 

Если вы хотите параллельное выполнение вы должны использовать исполнитель. Я предлагаю вам использовать исполнителя вместо выполнения asynctask в цикле for.

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

http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor(java.util.concurrent.Executor, Params ...)

Проверка порядка исполнения @

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

+0

адрес страницы динамичны, как я могу сделать url1, URL2, url3 ... – jason

+0

@jason url1, url2 - пример. Неважно, динамика или нет. Лучше использовать исполнитель для параллельного выполнения, если вас не беспокоит порядок выполнения. если вас беспокоит порядок, вы можете использовать Serial-исполнитель. – Raghunandan

+0

awesome + 1.Thanks – jason

2

в doInBackground вы должны использовать

url_select = params[0]; 

вместо url_select = и ; (вы назначаете u в цикле for при выполнении задачи асинхронно, поэтому вы не можете «знать, какое значение u имеет при выполнении задачи ... и в конечном итоге оно сохраняет последнее значение, которое вы назначили.)

+0

этот вызов будет работать \t «новый MyAsyncTask(). Execute (u);» – jason

+0

да, этот звонок правильный. и параметр, который вы передаете для выполнения, будет доступен в doInBackground как параметр [0] – jpm

1

String url_select = u;

Я думаю, что проблема здесь вы используете жёстко прописанные значение здесь вы должны получить переданное значение из params

String url_select = params[0];

+0

будет ли этот вызов работать \t «новый MyAsyncTask(). execute (u);" – jason

+0

Да, что должно работать –

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