У меня странная проблема с AsyncTask. Я использую AsyncTask для загрузки данных с моего сайта и создания ListView с данными этих тезисов. Я устанавливаю слушателя для каждого элемента, когда я нажимаю на элемент, я начинаю новое действие.
Но когда загружается мое новое действие, старая асинхронная задача (из первого действия) перезагружается и вызывает сбой моего приложения. (Потому что он пытается изменить ListView, который больше не существует)
Я проверил состояние моей AsyncTask, и она никогда не завершается (всегда возвращается RUNNING, но onPostExecute () выполняется)
package com.wglxy.example.dash1;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;
import android.os.Bundle;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.SimpleAdapter;
public class F1Activity extends DashboardActivity {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView (R.layout.activity_f2);
setTitleFromActivityLabel (R.id.title_text);
// Je démarre l'AsyncTask qui charge les interventions
getInterventionListing Listing = new getInterventionListing();
Listing.execute();
}
private class getInterventionListing extends AsyncTask<Integer, Integer, ArrayList<HashMap<String, String>>>
{
private ProgressDialog dialog;
@Override
protected void onPreExecute()
{
// Dialog qui s'affiche durant l'AsyncTask
dialog = ProgressDialog.show(F1Activity.this, "Chargement", "Chargement des données",true,true,new OnCancelListener() {
public void onCancel(DialogInterface dialog) {
dialog.dismiss();
cancel(true);
}});
}
@Override
protected ArrayList<HashMap<String, String>> doInBackground(Integer... params)
{
InputStream is = null;
String result = "";
String problemes = "";
String prenom = "";
String strURL = "http://monsiteweb.com/fichier.php";
ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("listing_intervention",""));
// Requête HTTP
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(strURL);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
Log.e("log_tag", "Error in http connection " + e.toString());
}
HashMap<String, String> map;
// Convertion de la requête en string
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result=sb.toString();
}catch(Exception e){
Log.e("log_tag", "Error converting result " + e.toString());
}
// Parse des données JSON
try{
JSONArray jArray = new JSONArray(result);
for(int i=0;i<jArray.length();i++){
JSONObject json_data = jArray.getJSONObject(i);
if (json_data.getString("problemes") != "null")
problemes = json_data.getString("problemes");
if (json_data.getString("prenom") != "null")
prenom = json_data.getString("prenom");
map = new HashMap<String, String>();
map.put("titre", "N°" + json_data.getInt("id_intervention") + " : " + json_data.getString("nom") + " " + prenom);
map.put("description", problemes);
map.put("id_intervention", json_data.getString("id_intervention"));
map.put("id_client", json_data.getString("id_client"));
if (json_data.getInt("statut") == 0)
{
map.put("img", String.valueOf(R.drawable.onwork));
}
else if (json_data.getInt("statut") == 2)
{
map.put("img", String.valueOf(R.drawable.onwait));
}
else if (json_data.getInt("statut") == 6)
{
map.put("img", String.valueOf(R.drawable.home));
}
else
{
map.put("img", String.valueOf(R.drawable.other));
}
listItem.add(map);
}
}catch(JSONException e){
Log.e("log_tag", "Error parsing data " + e.toString());
}
return listItem;
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> listItem)
{
ListView maListViewPerso = (ListView) findViewById(R.id.listviewperso);
SimpleAdapter mSchedule = new SimpleAdapter (F1Activity.this, listItem, R.layout.listview,
new String[] {"img", "titre", "description"}, new int[] {R.id.img, R.id.titre, R.id.description});
maListViewPerso.setAdapter(mSchedule);
maListViewPerso.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
ListView maListViewPerso = (ListView) findViewById(R.id.listviewperso);
HashMap<String, String> items_loaded = (HashMap<String, String>) maListViewPerso.getItemAtPosition(position);
Intent defineIntent = new Intent(F1Activity.this, Details_intervention.class);
Bundle objetbundle = new Bundle();
objetbundle .putString("id_intervention",items_loaded.get("id_intervention").toString());
objetbundle .putString("id_client",items_loaded.get("id_client").toString());
defineIntent.putExtras(objetbundle );
F1Activity.this.startActivity(defineIntent);
}
});
dialog.dismiss();
}
}
}
-
03-03 16:58:27.300: W/dalvikvm(656): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
03-03 16:58:27.320: E/AndroidRuntime(656): FATAL EXCEPTION: main
03-03 16:58:27.320: E/AndroidRuntime(656): java.lang.NullPointerException
03-03 16:58:27.320: E/AndroidRuntime(656): at com.wglxy.example.dash1.F1Activity$getInterventionListing.onPostExecute(F1Activity.java:164)
03-03 16:58:27.320: E/AndroidRuntime(656): at com.wglxy.example.dash1.F1Activity$getInterventionListing.onPostExecute(F1Activity.java:1)
03-03 16:58:27.320: E/AndroidRuntime(656): at android.os.AsyncTask.finish(AsyncTask.java:602)