Перезагрузка AsyncTask после изменения Activity - PullRequest
0 голосов
/ 03 марта 2012

У меня странная проблема с 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)

1 Ответ

1 голос
/ 26 апреля 2012

Если вам все еще нужна помощь ...

Можете ли вы опубликовать код для действия, которое вы вызываете через onClick - Details_intervention.class?

Пара замечаний:

  1. Вы можете начать занятие, просто набрав startActivity(defineIntent), вам не нужно F1Activity.this.

  2. Не будьте разборчивы, но вы нарушаете некоторые соглашения Java-кодирования повсюду. Хотя это не повредит приложению, некоторые вещи не являются стандартными и на первый взгляд странными: например, private class getInterventionListing - классы должны начинаться с заглавной буквы, а предисловие «get» и «set» используются только для методов. Так что private class DownloadInterventionListing будет лучше.

...