强制关闭的原因HTTP单位不得为空 [英] force close cause HTTP entity may not be null

查看:179
本文介绍了强制关闭的原因HTTP单位不得为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面一个完整的code asyntask发送数据的Http

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

}

申请工作,但
当我把错误的URL或连接超时,应用部队密切。

the application work but when i put wrong url or connection timeout, the application is force close .

这是我的logcat

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

力接近行 TEMP = EntityUtils.toString(实体);

如何解决?所以,当我把错误的URL或连接超时,应用程序不会强制关闭和显示信息发送失败

how to fix that? so when i put wrong url or connection timeout, the application not force close and display message "Send Failed". ?

BR

亚历

推荐答案

您有一个的Htt presponse 在那里,前的检查它的您尝试使用的实体。

You have an HttpResponse there, check it before you try to use the entity.

http://developer.android.com/参考/组织/阿帕奇/ HTTP / Htt的presponse.html

int code = response.getStatusLine().getStatusCode(); 
String message = response.getStatusLine().getReasonPhrase();

这是Apache使用了codeS(他们是标准的HTTP,但由于您使用的HttpClient 您可以参考这些看常数如果你有一个响应你期望的,或不):的http://开发商.android.com /参考/组织/阿帕奇/ HTTP / HttpStatus.html

And here are the constants Apache uses for the codes (they're standard HTTP, but since you're using HttpClient you can refer to these to see if you got a response you expect, or not): http://developer.android.com/reference/org/apache/http/HttpStatus.html

如果请求到达服务器和失败,响应将让你知道(对于错误的URL,如甚至没有解析主机,连接将超时,但是这不是你得到的错误)。而且,即使在这之后,我相信你还是应该检查该实体不为空将它传递前, EntityUtils (如果是空,别的意外错误,保释出)。

If 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):

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响应code是一个成功或重定向,以及4XX,5XX是错误的。下面是关于HTTP响应codeS一般一些更多的信息: HTTP://en.wikipedia .ORG /维基/ List_of_HTTP_status_ codeS

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

这篇关于强制关闭的原因HTTP单位不得为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆