Reputation: 944
I'm trying to display a ProgressDialog
while loading a json
feed from a http server. I get a NullPointerException
in doInBackground
and onPostExecute
. If I have not misunderstood AsyncTask
, in onPostExecute
the final code will run! Where is my fault?
Here's my activity code:
public class ResultInput extends Activity {
int count = 0;
String mainUrl;
String[] product_pict_part;
InputStream is = null;
private ProgressDialog pd;
String TAG = "meinDebug";
ParseEan parse_code;
String readProductNameEan;
ImageView productPic;
String productName;
Drawable drawable;
TextView product_name;
TextView text_level;
int productLevel;
private Context context;
// private MyProgressDialog dialog;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
new ProgressTask(ResultInput.this).execute();
}
private InputStream fetch(String urlString) throws MalformedURLException,
IOException {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(urlString);
HttpResponse response = httpClient.execute(request);
return response.getEntity().getContent();
}
private class ProgressTask extends AsyncTask<String, Void, Boolean> {
private ProgressDialog dialog;
private Activity activity;
// private List<Message> messages;
public ProgressTask(Activity activity) {
this.activity = activity;
context = activity;
dialog = new ProgressDialog(context);
}
/** progress dialog to show user that the backup is processing. */
/** application context. */
protected void onPreExecute() {
this.dialog.setMessage("Progress start");
this.dialog.show();
}
@Override
protected void onPostExecute(final Boolean success) {
pd.dismiss();
productPic.setImageDrawable(drawable);
Log.i(TAG, "Picture URL " + mainUrl);
product_name.setText(productName);
if (productLevel == 1) {
text_level.setText("helal");
} else if (productLevel == 2) {
text_level.setText("mittel");
} else if (productLevel == 3) {
text_level.setText("haram");
} else if (productLevel == 4) {
text_level.setText("in analyse");
}
if (dialog.isShowing()) {
dialog.dismiss();
}
if (success) {
Toast.makeText(context, "OK", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "Error", Toast.LENGTH_LONG).show();
}
}
protected Boolean doInBackground(final String... args) {
try {
mainUrl = "http://nur-efsan.de/websHalalCheck/public/image/index/dir/";
product_name = (TextView) findViewById(R.id.produkt_name);
text_level = (TextView) findViewById(R.id.text_level);
productPic = (ImageView) findViewById(R.id.productpic);
productName = parse_code.parseJSONPost("data", "name",
readProductNameEan);
String productPicture = parse_code.parseJSONPost("data",
"image", readProductNameEan);
productLevel = Integer.parseInt(parse_code.parseJSONPost(
"data", "levelId", readProductNameEan));
product_pict_part = productPicture.split("/");
mainUrl = mainUrl + product_pict_part[0] + "/name/"
+ product_pict_part[1];
try {
is = fetch(mainUrl);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
drawable = Drawable.createFromStream(is, "src");
return true;
} catch (Exception e) {
Log.e("tag", "error", e);
return false;
}
}
}
}
Upvotes: 2
Views: 2006
Reputation: 944
many thanks for the reply! i change my code as you have described it to me! and i have forget to set my content view :) my final code:
package com.halal.helalcheck;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
public class ResultInput extends Activity {
int count = 0;
String mainUrl;
String[] product_pict_part;
InputStream is = null;
String TAG = "meinDebug";
ParseEan parse_code = new com.halal.helalcheck.ParseEan();
String readProductNameEan;
ImageView productPic;
String productName;
Drawable drawable;
TextView product_name;
TextView text_level;
int productLevel;
private Context context;
// private MyProgressDialog dialog;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.resultwindow);
mainUrl = "http://nur-efsan.de/websHalalCheck/public/image/index/dir/";
product_name = (TextView) findViewById(R.id.produkt_name);
text_level = (TextView) findViewById(R.id.text_level);
productPic = (ImageView) findViewById(R.id.productpic);
new ProgressTask(ResultInput.this).execute();
}
private InputStream fetch(String urlString) throws MalformedURLException,
IOException {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(urlString);
HttpResponse response = httpClient.execute(request);
return response.getEntity().getContent();
}
private class ProgressTask extends AsyncTask<String, Void, Boolean> {
private ProgressDialog dialog;
private Activity activity;
public ProgressTask(Activity activity) {
this.activity = activity;
context = activity;
dialog = new ProgressDialog(context);
}
/** progress dialog to show user that the backup is processing. */
/** application context. */
@Override
protected void onPreExecute() {
this.dialog.setMessage("Checking Product");
this.dialog.show();
}
@Override
protected void onPostExecute(final Boolean success) {
drawable = Drawable.createFromStream(is, "src");
productPic.setImageDrawable(drawable);
Log.i(TAG, "Picture URL " + mainUrl);
product_name.setText(productName);
if (productLevel == 1) {
text_level.setText("helal");
} else if (productLevel == 2) {
text_level.setText("mittel");
} else if (productLevel == 3) {
text_level.setText("haram");
} else if (productLevel == 4) {
text_level.setText("in analyse");
}
if (dialog.isShowing()) {
dialog.dismiss();
}
}
@Override
protected Boolean doInBackground(final String... args) {
try {
Bundle b = getIntent().getExtras();
String ean_code = b.getString("barcodestring");
String readProductNameEan = parse_code.readProductEan(ean_code);
Log.i(TAG, readProductNameEan);
productName = parse_code.parseJSONPost("data", "name", readProductNameEan);
Log.i(TAG, productName);
productLevel = Integer.parseInt(parse_code.parseJSONPost( "data", "levelId", readProductNameEan));
String productPicture = parse_code.parseJSONPost("data", "image", readProductNameEan);
product_pict_part = productPicture.split("/");
mainUrl = mainUrl + product_pict_part[0] + "/name/" + product_pict_part[1];
try {
is = fetch(mainUrl);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
} catch (Exception e) {
Log.e("tag", "error", e);
return false;
}
}
}
}
Upvotes: 0
Reputation: 40406
in OnPostExecute method
dialog.dismiss();
instead of
pd.dismiss();
Second
you should not refrences TextView or imageview(productname,testview...) in doInBackgroud(...) method because doinbackground method is non UI thread.
So give refrence in onCreate method and then call asyncTask
and setValue in onPostExecute method...
Upvotes: 1