这里有一个完整的代码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);
}
}
申请工作但是 当我把错误的网址或连接超时时,应用程序强行关闭。
这是我的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
强行关闭temp = EntityUtils.toString(entity);
如何解决这个问题?因此,当我输入错误的网址或连接超时时,应用程序不会强行关闭并显示消息"Send Failed"
。
?
BR
亚历
答案 0 :(得分:3)
您有一个HttpResponse
,在尝试使用该实体之前检查。
http://developer.android.com/reference/org/apache/http/HttpResponse.html
int code = response.getStatusLine().getStatusCode();
String message = response.getStatusLine().getReasonPhrase();
以下是Apache用于代码的常量(它们是标准的HTTP,但是因为你使用的是HttpClient
,你可以参考这些来查看你是否得到了你期望的响应): http://developer.android.com/reference/org/apache/http/HttpStatus.html
如果请求到达服务器并且失败,响应将通知您(对于“错误的URL”,例如甚至不解析主机,连接将超时,但这不是您获得的错误)。而且,即使在那之后,我相信你仍然应该在将实体传递给EntityUtils
之前检查该实体是否为空(如果它是null,则其他意外的错误,纾困)。
这是一个应该指向正确方向的示例(我不建议只是复制/粘贴它,而是试图理解它;这是一个广泛的概括,你可能只想检查标准OK响应,而不是重定向,或者你的服务器端可能正在做一些非标准的事情,这取决于服务器):
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();
}
通常,200到399之间的HTTP响应代码是成功或重定向,4xx,5xx是错误。以下是有关HTTP响应代码的更多信息:http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
答案 1 :(得分:0)
您可以通过以下代码保持请求超时和套接字异常。
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.
}
即使你可以在catch块中返回一些默认结果,无论你想要什么。