Как правильно обрабатывать завершение Async Task?
Я использую AsyncTask для получения всех данных, которые нужны моему приложению, с сервера. Это отлично работает. Однако при перезапуске приложения во второй раз приложение вылетает.
Я получаю следующий журнал ошибок:
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();
}
}
Я надеюсь, что кто-то с немного большим опытом сможет объяснить мне правильный, правильный способ обойти эту аварию...
Приветствия и спасибо всем, кто нашел время, чтобы ответить и помочь мне...
2 ответа
Я подозреваю, что вы никогда не сбрасываете свой descriptionArray_Counter обратно в 0. Поэтому, когда вы выполняете свою задачу, следующая строка
Resources.descriptionArray[descriptionArray_Counter] = response;
вероятно оценивает
Resources.descriptionArray[14] = response;
и ваш массив описания имеет длину только 14. Вы можете видеть в трассировке стека, что он говорит вам об этом точно.
Вы получаете ошибку arrayIndexOutOfBounds. Один из ваших вызовов массива, особенно в строке 88, выходит за пределы. AsynchTask не является проблемой.