4

这里有一个完整的代码异步任务来发送数据 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);
    }

}

应用程序工作,但是当我输入错误的 url 或连接超时时,应用程序被强制关闭。

这是我的日志猫

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);

如何解决?所以当我输入错误的 url 或连接超时时,应用程序不会强制关闭并显示消息"Send Failed"。?

BR

亚历克斯

4

2 回答 2

4

你有一个,在你尝试使用实体之前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(如果它为空,则出现其他意外错误,请退出)。

这是一个应该为您指明正确方向的示例(我不建议仅复制/粘贴它,而是尝试理解它;这是一个广泛的概括,您可能只想检查标准的 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

于 2013-01-25T03:43:36.507 回答
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 块中返回任何您想要的默认结果。

于 2013-01-25T03:44:53.670 回答