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

+3


source to share


2 answers


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

+3


source


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.

0


source







All Articles