简体   繁体   中英

get json data in ListView with AsyncTask

I would like to display some data from my server in my ListView with an asyncTask . The connection and JsonParser work well, but I have an error in my OnPostExecute() , when I try to put my data in the ListView .

So, this is the class that calls the asynctask :

public class GetInfo extends Activity{ 

    ListView listeView;

    protected void onCreate(Bundle bundle)
    {
        super.onCreate(bundle);    
        setContentView(R.layout.listdata);   
        listeView = (ListView) findViewById(R.id.maListeView);     

        GetJson getJson = new GetJson(GetInfo.this);
        getJson.execute();           
    }
}

Here there are no problems. This is my class AsyncTask :

class GetJson extends AsyncTask<Void, Integer,  ArrayList<String>> {

    private Context Mycontext;
    private ListView listview; 
    private ArrayAdapter<String> arrayadapter;
    private ProgressDialog pDialog;
    private ArrayList<String> donnees;
    private ListActivity listAct;

    public GetJson(GetInfo getInfo) {
        Mycontext = getInfo;
    }

    @Override
    protected void onPreExecute() {
        // Showing progress dialog before sending http request
        this.pDialog  = new ProgressDialog(Mycontext);
        this.pDialog.setMessage("Please wait..");
        this.pDialog.setIndeterminate(true);
        this.pDialog.setCancelable(false);
        this.pDialog.show();    
    }

    @Override
    protected  ArrayList<String> doInBackground(Void... arg0) {          
        String result = null;
        InputStream is = null;
        JSONObject json_data=null;
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        this.donnees = new ArrayList<String>();

        try{
            //commmand http
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://192.168.0.100/timesync.php");
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
        }
        catch(Exception e){
            Log.i("taghttppost",""+e.toString());           
        }

        //parse response
        try
        {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-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.i("tagconvertstr",""+e.toString());
        }        

        //get json data
        try{
            JSONArray jArray = new JSONArray(result);             
            for(int i=0;i<jArray.length();i++)
            {             
                json_data = jArray.getJSONObject(i);
                this.donnees.add("date :"+ json_data.getString("time") + " ou " +
                    json_data.getString("date") + json_data.getString("hour"));     
            }
        }
        catch(JSONException e){
            Log.i("tagjsonexp",""+e.toString());
        } catch (ParseException e) {
            Log.i("tagjsonpars",""+e.toString());
        }
        return this.donnees;
    }

    @Override
    protected void onPostExecute(ArrayList<String> donnees) {    
        super.onPostExecute(donnees);

        this.pDialog.dismiss();

        for(int i=0;i<donnees.size();i++)
        {             
            Log.i("time", donnees.get(i));
        } 

        // this.arrayadapter = new ArrayAdapter<String>(Mycontext, android.R.layout.simple_list_item_1, this.donnees);
        // this.listview.setAdapter(this.arrayadapter);
    }
}

My problem is the commented lines:

// this.arrayadapter = new ArrayAdapter<String>(Mycontext, android.R.layout.simple_list_item_1, this.donnees);
// this.listview.setAdapter(this.arrayadapter);

and I don't understand why ...

This is my error:

11-05 16:43:36.560: E/AndroidRuntime(11200): FATAL EXCEPTION: main
11-05 16:43:36.560: E/AndroidRuntime(11200): java.lang.NullPointerException
11-05 16:43:36.560: E/AndroidRuntime(11200):at com.json.GetJson.onPostExecute(Adapter.java:134)
11-05 16:43:36.560: E/AndroidRuntime(11200):at android.os.AsyncTask.finish(AsyncTask.java:631)
11-05 16:43:36.560: E/AndroidRuntime(11200):at android.os.AsyncTask.access$600(AsyncTask.java:177)
11-05 16:43:36.560: E/AndroidRuntime(11200):at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)

.
.
.

The result is being logged, so I'm pretty sure that my code is passed into OnPostExecute() .

Remove the line private ListView listview; line from the GetJson class. The problem is you are accessing the listview object of GetJson class(which is'nt initialized) instead of the Activity's listview object.

Access the listview of GetInfo Activity directly like this

listview.setAdapter(this.arrayadapter);

ListView listview is not initialized in GetJSON . Hence you get NullPointerException .

You probably want to make asynctask an inner class of your activity and remove the declaration of listview in GetJSON since if you make it inner class it is already declared as a class member in GetInfo .

listeView = (ListView) findViewById(R.id.maListeView) is in GetInfo .

Or use a interface as callback and set the listview in your activity class for example

How do I return a boolean from AsyncTask?

Instead of boolean in the example its ArrayList<String> donnees in your case.

The problem is that your list view is not initialized.

Step 1) Update the AsyncTask constructor:

public GetJson(GetInfo getInfo, ListView list) {
    Mycontext = getInfo;
    listView = list;
}

Step 2) Do this in OnCreate

GetJson getJson = new GetJson(GetInfo.this, listeView);
getJson.execute();

Which ListView are you trying to use? One in GetInfo class or one in GetJson class?

The one you have declared in GetJson class need to be instantiated if you want to use it as

listeView = (ListView) findViewById(R.id.xxxx);

If you are handling any UI operations on PostExecute Menthod then try under this :

Handler refresh = new Handler(Looper.getMainLooper());
        refresh.post(new Runnable() {
            public void run( ){
                             // try UI here .
                            });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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