2012-04-17 1 views
0

Я использую AsyncTask, чтобы получить все данные, необходимые моему приложению с сервера. Это прекрасно работает. Однако при повторном запуске приложения во второй раз приложение аварийно завершает работу.Как правильно обрабатывать задачу Async Task?

я получаю следующее ErrorLog:

04-17 14:22:57.171: E/AndroidRuntime(956): FATAL EXCEPTION: AsyncTask #2 
04-17 14:22:57.171: E/AndroidRuntime(956): java.lang.RuntimeException: An error occured while executing doInBackground() 
04-17 14:22:57.171: E/AndroidRuntime(956): at android.os.AsyncTask$3.done(AsyncTask.java:278) 
04-17 14:22:57.171: E/AndroidRuntime(956): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
04-17 14:22:57.171: E/AndroidRuntime(956): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
04-17 14:22:57.171: E/AndroidRuntime(956): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
04-17 14:22:57.171: E/AndroidRuntime(956): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
04-17 14:22:57.171: E/AndroidRuntime(956): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
04-17 14:22:57.171: E/AndroidRuntime(956): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
04-17 14:22:57.171: E/AndroidRuntime(956): at java.lang.Thread.run(Thread.java:856) 
04-17 14:22:57.171: E/AndroidRuntime(956): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=14; index=14 
04-17 14:22:57.171: E/AndroidRuntime(956): at flexform.ro.android.app.FlexFormActivity$getDataClass.doInBackground(FlexFormActivity.java:88) 
04-17 14:22:57.171: E/AndroidRuntime(956): at flexform.ro.android.app.FlexFormActivity$getDataClass.doInBackground(FlexFormActivity.java:1) 
04-17 14:22:57.171: E/AndroidRuntime(956): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
04-17 14:22:57.171: E/AndroidRuntime(956): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 

Ниже есть мой AsyncTask класс:

class getDataClass extends AsyncTask<String, Void, String>{ 
    protected String doInBackground(String...urls){ 
     String response = ""; 
     for(String url : urls){ 
      response = ""; 
      descriptionArray_Counter++; 

      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try{ 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 

       BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); 

       String s = ""; 

       while((s = buffer.readLine()) != null){ 
        response += s; 
       } 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
      Resources.descriptionArray[descriptionArray_Counter] = response; 
     } 
     return response; 
    } 

    protected void onPostExecute(String result){ 
     Toast.makeText(getApplicationContext(), "All entres have been loaded!", Toast.LENGTH_SHORT).show(); 

     JSONArray offersJSON; 
     JSONArray newsJSON; 

     try{ 
      newsJSON = new JSONArray(Resources.descriptionArray[9]); 

      if(newsJSON.length() > 20) 
       Resources.newsLength = 20; 
      else 
       Resources.newsLength = newsJSON.length(); 

      for(int i = 0; i < Resources.newsLength; i++){ 
       JSONObject tempObject = newsJSON.getJSONObject(i); 

       Resources.news_id[i] = tempObject.getString("id"); 
       Resources.news_title[i] = tempObject.getString("title"); 
       Resources.news_descriptionShort[i] = tempObject.getString("description_short"); 
       Resources.news_descriptionLong[i] = tempObject.getString("description_long"); 
       Resources.news_date[i] = tempObject.getString("date"); 
       Resources.news_urgent[i] = tempObject.getString("urgent"); 
      } 
     }catch(JSONException e){ 
      e.printStackTrace(); 
     } 
     try { 
      offersJSON = new JSONArray(Resources.descriptionArray[10]); 


     if(offersJSON.length() > 20) 
      Resources.offersLength = 20; 
     else 
      Resources.offersLength = offersJSON.length(); 

     for(int i = 0; i < Resources.offersLength; i++){ 
      JSONObject tempObject = offersJSON.getJSONObject(i); 

      Resources.offers_id[i] = tempObject.getString("id"); 
      Resources.offers_offertant[i] = tempObject.getString("Ofertant"); 
      Resources.offers_description[i] = tempObject.getString("Descriere"); 
      Resources.offers_contact[i] = tempObject.getString("Contact"); 
      Resources.offers_date[i] = tempObject.getString("Data"); 
      Resources.offers_available[i] = tempObject.getString("Valabil"); 

     } 
     Intent intent = new Intent(FlexFormActivity.this, MainMenu.class); 
     startActivity(intent); 

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

    } 

Я надеюсь, что кто-то с немного больше опыта будет в состоянии объяснить мне надлежащий , правильный способ обойти эту катастрофу ...

Приветствия и спасибо тому, кто принимает время, чтобы ответить и помочь мне ...

ответ

3

Я подозреваю, что вы никогда не сбросить descriptionArray_Counter обратно в 0. Таким образом, при выполнении вашей задачи следующей строки

Resources.descriptionArray[descriptionArray_Counter] = response; 

, вероятно, вычисляемой

Resources.descriptionArray[14] = response; 

и описание вашего массив только длина 14. Вы можете видеть в своей трассе стека, что она вам точно это говорит.

+0

Извините ... теперь чувствуйте себя немым. Был кодирование в течение нескольких часов и просто пропустил его. Большое спасибо за просмотр кода и ответ. – Eugen

+0

Еще одна подозрительная часть вашего кода заключается в том, что вы увеличиваете описаниеArray_Counter в начале цикла for. Вы уверены, что не собираетесь делать это после того, как вы ответили в массиве? –

1

Вы получаете ошибку arrayIndexOutOfBounds. Один из ваших вызовов массива, особенно в строке 88, выходит за пределы. AsynchTask не является проблемой.