Forced closed reason. The HTTP object cannot be null.
here's the complete asyntask code for sending Http data
private class MyAsyncTaskPupuk extends AsyncTask<Void,Object ,Void> {
boolean bNodata=false;
boolean bError=false;
@Override
protected Void doInBackground(Void... arg0) {
bNodata=false;
bError=false;
recordCount=cursorSend.getCount();
if (recordCount<=0){//
bNodata=true;
return null;
}
cursorSend.moveToFirst();
publishProgress(0,"Sending data started");
//SystemClock.sleep(1000);
CHamaRecord rec=new CHamaRecord();
for (int i=0; i<recordCount; i++){
if (isCancelled()) break;
rec.lID=cursorSend.getLong(0);
rec.dLongitude=cursorSend.getDouble(1);
rec.dLatitude=cursorSend.getDouble(2);
rec.dAccuracy=cursorSend.getDouble(3);
rec.sFilename=cursorSend.getString(4);
rec.nUserId=cursorSend.getInt(5);
rec.nRate=cursorSend.getInt(6);
rec.lDate=cursorSend.getLong(7);
rec.sSent=cursorSend.getString(8);
rec.IDSite=cursorSend.getString(9);
rec.alamatSite=cursorSend.getString(10);
rec.komoditas=cursorSend.getString(11);
rec.luasSite=cursorSend.getString(12);
rec.petugas=cursorSend.getString(13);
rec.jnsHama=cursorSend.getString(14);
rec.jmlHama=cursorSend.getString(15);
rec.sn=cursorSend.getString(16);
rec.pn=cursorSend.getString(17);
rec.manufaktur=cursorSend.getString(18);
rec.lblHama=cursorSend.getString(19);
rec.lblKomoditas=cursorSend.getString(20);
rec.lblPetugas=cursorSend.getString(21);
publishProgress(1,i,rec);
if (!SendDataFoto(rec)){
recordCount=i;
bError=true;
break;
}
else {
//change flag sent
rec.sSent=CGeneral.strSent;
cDBPupuk.updateEntry(rec.lID, rec);
}
cursorSend.moveToNext();
}
return null;
}//doInBackground
private boolean SendDataFoto(CHamaRecord rec){
String slon=String.format("%f", rec.dLongitude);
String slat=String.format("%f", rec.dLatitude);
String sacc=String.format("%f", rec.dAccuracy);
String srate=String.format("%d",rec.nRate);
String sid=String.format("%d",rec.nUserId);
String ids=String.format(rec.IDSite);
String alt=String.format(rec.alamatSite);
String kmd=String.format(rec.komoditas);
String ls=String.format(rec.luasSite);
String op=String.format(rec.petugas);
String jns=String.format(rec.jnsHama);
String jml=String.format(rec.jmlHama);
String sn=String.format(rec.sn);
String pn=String.format(rec.pn);
String mFact=String.format(rec.manufaktur);
String lblhama=String.format(rec.lblHama);
String lblKomoditas=String.format(rec.lblKomoditas);
File file=new File(rec.sFilename);
String sfname=file.getName();
String cfname=file.getName();
int i=0;
String lfname=rec.sFilename;
sfname = sfname.substring(0, sfname.lastIndexOf("."));
Calendar cal=Calendar.getInstance();
cal.setTime(new Date(rec.lDate));
String sdat=CUtilities.DateToString(cal);
String url;
String spupuk;
if (CGeneral.nPupukOrPelihara==CGeneral.ACTIVITY_FOR_PUPUK){
url = CGlobalConfig.getURLRcvrPupuk();
spupuk="Hama";
}
else{
url = CGlobalConfig.getURLRcvrPeliharaImage();
spupuk="pelihara";
}
Bitmap bmp=BitmapFactory.decodeFile(lfname);
ByteArrayOutputStream bao = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 90, bao);
byte[] ba = bao.toByteArray();
HttpEntity entity=null;
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
ByteArrayBody bab = new ByteArrayBody(ba, spupuk+"_"+cfname);
MultipartEntity reqEntity = new MultipartEntity(
HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("image", bab);
reqEntity.addPart("category", new StringBody(spupuk));
reqEntity.addPart("file_name", new StringBody(spupuk+"_"+cfname));
reqEntity.addPart("rate", new StringBody(srate));
reqEntity.addPart("tgl", new StringBody(sdat));
reqEntity.addPart("user_id", new StringBody(sid));
reqEntity.addPart("latitude", new StringBody(slat));
reqEntity.addPart("longitude", new StringBody(slon));
reqEntity.addPart("accuracy", new StringBody(sacc));
reqEntity.addPart("id_site", new StringBody(ids));
reqEntity.addPart("alamat_site", new StringBody(alt));
reqEntity.addPart("komoditas", new StringBody(kmd));
reqEntity.addPart("luas_area", new StringBody(ls));
reqEntity.addPart("petugas", new StringBody(op));
reqEntity.addPart("jenis_hama", new StringBody(jns));
reqEntity.addPart("jumlah_hama", new StringBody(jml));
reqEntity.addPart("serial", new StringBody(sn));
reqEntity.addPart("p_number", new StringBody(pn));
reqEntity.addPart("manufaktur", new StringBody(mFact));
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httppost);
entity = response.getEntity();
} catch (Exception e) {
Log.e(e.getClass().getName(), e.getMessage());
}
String temp = null;
try {
temp = EntityUtils.toString(entity);
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (temp.compareTo("SUCCESS") == 0) {
publishProgress(0,"Send Ok");
SystemClock.sleep(500);
return true;
}
else{
publishProgress(0,"Send Fail");
return false;
}
}
@Override
protected void onProgressUpdate(Object... arg) {
Integer oi=(Integer)arg[0];
String oStr;
CHamaRecord rec;
int flag=oi.intValue();
int nVal;
String str;
TextView tvStatus=(TextView) layoutSendDialog.findViewById(R.id.tvPupukSendStatus);
TextView tview;
switch (flag) {
case 0 :
oStr=(String)arg[1];
tvStatus.setText(oStr);
break;
case 1 :
oi=(Integer)arg[1];
rec=(CHamaRecord)arg[2];
nVal=oi.intValue();
str="Send record #"+String.format("%d",nVal);
tvStatus.setText(str);
str=String.format("%d", rec.lID);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendID);
tview.setText(str);
str=String.format(rec.IDSite);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendIDSite);
tview.setText(str);
str=String.format(rec.alamatSite);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendAlamat);
tview.setText(str);
str=String.format(rec.lblKomoditas);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendKomoditas);
tview.setText(str);
str=String.format(rec.luasSite);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendLuas);
tview.setText(str);
str=String.format(rec.lblPetugas);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendPetugas);
tview.setText(str);
str=String.format(rec.lblHama);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendJenis);
tview.setText(str);
str=String.format(rec.jmlHama);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendJumlah);
tview.setText(str);
str=String.format(rec.sn);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendSerial);
tview.setText(str);
str=String.format(rec.pn);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendProduk);
tview.setText(str);
str=String.format(rec.manufaktur);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendManufaktur);
tview.setText(str);
str=String.format("%+3.5f", rec.dLongitude);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendLongitude);
tview.setText(str);
str=String.format("%+3.5f", rec.dLatitude);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendLatitude);
tview.setText(str);
/*str=String.format("%2.2f", rec.dAccuracy);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendAccuracy);
tview.setText(str);*/
Date dt=new Date(rec.lDate);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendDate);
tview.setText(dt.toLocaleString());
/*str=String.format("%d", rec.nRate);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendRating);
tview.setText(str);
str=String.format("%d", rec.nUserId);
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendOperator);
tview.setText(str); */
File file=new File(rec.sFilename);
String fname=file.getName();
tview = (TextView) layoutSendDialog.findViewById(R.id.tvPupukSendFilename);
tview.setText(fname);
break;
}
}
//
@Override
protected void onPostExecute(Void unused) {
TextView tvStatus=(TextView) layoutSendDialog.findViewById(R.id.tvPupukSendStatus);
if (bNodata){
tvStatus.setText("No data to be sent!!!");
}else {
if (bError){
tvStatus.setText("Fail at record #"+String.format("%d",recordCount));
}
else {
tvStatus.setText("Sending Data : Finished");
}
}
// dismissDialog(CGeneral.DIALOG_SEND);
}
protected void onCancelled(Void unused) {
dismissDialog(CGeneral.DIALOG_SEND);
}
}
app running, but when i set wrong url or connection timeout, app forcibly closes.
here is my logcat
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): FATAL EXCEPTION: AsyncTask #1
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): java.lang.RuntimeException: An error occured while executing doInBackground()
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at android.os.AsyncTask$3.done(AsyncTask.java:200)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at java.lang.Thread.run(Thread.java:1019)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): Caused by: java.lang.IllegalArgumentException: HTTP entity may not be null
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at org.apache.http.util.EntityUtils.toString(EntityUtils.java:110)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at hariff.ltis.inputhama.CInputHamaApp$MyAsyncTaskPupuk.SendDataFoto(CInputHamaApp.java:1307)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at hariff.ltis.inputhama.CInputHamaApp$MyAsyncTaskPupuk.doInBackground(CInputHamaApp.java:1040)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at hariff.ltis.inputhama.CInputHamaApp$MyAsyncTaskPupuk.doInBackground(CInputHamaApp.java:1)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at android.os.AsyncTask$2.call(AsyncTask.java:185)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
01-25 10:11:27.554: ERROR/AndroidRuntime(2587): ... 4 more
01-25 10:11:27.570: DEBUG/u-blox(1308): ublox_stop :
01-25 10:11:27.570: WARN/ActivityManager(1308): Force finishing activity hariff.ltis.mainmenu/hariff.ltis.inputhama.CInputHamaApp
closing force in line temp = EntityUtils.toString(entity);
How to fix it? so when i set wrong url or connection time the app doesn't force close and display message "Send Failed"
.
BR
Alex
source to share
You have it HttpResponse
there, check it out before you try to use the entity.
http://developer.android.com/reference/org/apache/http/HttpResponse.html
int code = response.getStatusLine().getStatusCode();
String message = response.getStatusLine().getReasonPhrase();
And here are the constants Apache uses for the codes (they are standard HTTP, but since you are using HttpClient
, you can refer to them to see if you have the response you expect or not): http://developer.android. com / reference / org / apache / http / HttpStatus.html
If the request hits the server and fails, the response will let you know (for a "wrong url" like not even allowing the host, the connection will time out, but that's not the error you're getting). And even after that, I suppose you should still check that the object is not null before passing it to EntityUtils
(if it is null, something else unexpected went wrong, exit it).
Here is an example that should point you in the right direction (I would not recommend just copy / paste it, but try to figure it out, this is a broad generalization, you can just check the standard OK answers, not the redirects and your server side might do something non-standard, depending on the server):
HttpResponse httpResponse = null;
String response = null;
String message = null;
int code = -1;
try {
httpResponse = client.execute(request);
code = httpResponse.getStatusLine().getStatusCode();
message = httpResponse.getStatusLine().getReasonPhrase();
Log.i("LOG_TAG", "HTTP response -- code:" + code + " message:" + message);
if (code >= 200 && code <= 399) {
Log.v("LOG_TAG", "got valid HTTP response code (200-399) processing response entity");
HttpEntity entity = httpResponse.getEntity();
if (entity != null) {
InputStream instream = null;
try {
instream = entity.getContent();
// convert stream if gzip header present in response
Header contentEncoding = httpResponse.getFirstHeader("Content-Encoding");
if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
instream = new GZIPInputStream(instream);
}
response = convertStreamToString(instream);
} finally {
if (instream != null) {
instream.close();
}
}
}
} else {
// GOT SOME NON-VALID CODE, 404 (not found), 5xx (error), etc (log this, react to this, whatever, but you can't just use the "entity")
}
} catch (ClientProtocolException e) {
throw new RuntimeException("ERROR:" + e.getMessage(), e);
} catch (IOException e) {
throw new RuntimeException("ERROR:" + e.getMessage(), e);
} finally {
// shutdown connections
client.getConnectionManager().shutdown();
}
In general, HTTP response codes 200 to 399 are success or redirection, and 4xx, 5xx are errors. Here's some more information on HTTP response codes in general: http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
source to share
You can save request timeout and socket exception by following code.
try{
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 20000);
HttpConnectionParams.setSoTimeout(httpParams, 20000);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
.................................
..................................
...................................
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httppost);
entity = response.getEntity();
}catch(ConnectTimeoutException e){
//Do whatever you want here when you get timeout in connection
}catch(SocketTimeoutException scte){
// Do whatever you want here when you get sockettimeout exception...
}catch(Exception e){
//Do whatever you want here when you get unexpected exception... It is root exception . So whatever exception you didn't catch in the above, the control obviously gets into this block.
}
Even you can return whatever default results you want in the catch blocks.
source to share