繁体   English   中英

更改Activity后重新加载AsyncTask

[英]AsyncTask reloading after changing Activity

我对AsyncTask有一个奇怪的问题。 我正在使用AsyncTask从我的网站加载数据,并使用这些数据创建ListView。 我为每个项目设置一个侦听器,当我单击某个项目时,我将启动一个新活动。

但是,当我的新活动加载时,旧的asynctask(来自第一个活动)将重新加载,并使我的应用程序崩溃。 (因为它试图修改不再存在的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)

如果您仍然需要帮助...

您可以为通过onClick- Details_intervention.class调用的活动发布代码吗?

几个注意事项:

  1. 您可以通过仅具有startActivity(defineIntent)来启动活动,而无需F1Activity.this.

  2. 别太挑剔,但是您始终在破坏一些Java编码约定。 尽管它不会损害应用程序,但有些事情不是标准的,乍看之下很奇怪:例如private class getInterventionListing类应以大写字母开头,并且序言“ get”和“ set”仅用于方法。 因此, private class DownloadInterventionListing会更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM