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.