here a full code asyntask to Send Data Http
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);
}
}
the application work but
when i put wrong url or connection timeout, the application is force close .
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
force close in line temp = EntityUtils.toString(entity);
how to fix that? so when i put wrong url or connection timeout, the application not force close and display message "Send Failed".
?
BR
Alex
You have an
HttpResponsethere, check it before you try to use the entity.http://developer.android.com/reference/org/apache/http/HttpResponse.html
And here are the constants Apache uses for the codes (they’re standard HTTP, but since you’re using
HttpClientyou can refer to these to see if you got a response you expect, or not): http://developer.android.com/reference/org/apache/http/HttpStatus.htmlIf the request gets to the server and fails, the response will let you know (for “wrong url” such as not even resolving the host, the connection will timeout, but that’s not the error you’re getting). And, even after that, I believe you should still check that the entity is not null before you pass it to
EntityUtils(if it is null, something else unexpected went wrong, bail out).Here’s an example that should point you in the right direction (I would not recommend just copying/pasting it, but rather trying to understand it; this is a broad generalization, you may want to just check for standard OK responses, not redirects, and or your server side may be doing something non-standard, that depends on the server):
In general an HTTP response code between 200 and 399 is a success or redirect, and 4xx, 5xx are errors. Here’s some more info on HTTP response codes in general: http://en.wikipedia.org/wiki/List_of_HTTP_status_codes