2013-03-27 2 views
0

Я пытаюсь отправить данные на веб-сервер.принудительное закрытие при отправке данных на веб-сервер

первый. я использую только HttpResponse, чтобы знать, что данные отправлены или нет в устройстве, и работает

и я пытаюсь положить ResponseHandler, чтобы знать, что данные отправлены или не прочитаны на веб-сервере.

Я создаю два ответа.

, когда данные не передаются или не,
оба, сообщение об ошибке и тосты шоу и работает

но когда данные передаются тост шоу, но сообщение об ошибке не показывать и то сила близко

вот мой код

private boolean SendDataFoto(CPetakRecord rec){ 


     String slon=String.format("%f", rec.dLongitude); 
     String slat=String.format("%f", rec.dLatitude); 
     String sacc=String.format("%f", rec.dAccuracy); 
     String jnsHm=String.format(rec.jenisHm); 
     String jmlHm=String.format(rec.jumlahHm); 
     String jnsMsh=String.format(rec.jenisMsh); 
     String jmlMsh=String.format(rec.jumlahMsh); 
     String intens=String.format(rec.intensitas); 
     String luasAncam=String.format(rec.luasTerancam); 
     String nmPetak=String.format(rec.nmPetak); 
     String code=String.format(rec.code); 
     String userId=String.format(rec.userId); 
     String varietas=String.format(rec.varietas); 
     String dbLon=String.format("%f", rec.dbLon); 
     String dbLat=String.format("%f", rec.dbLat); 


     File file=new File(rec.sFilename); 
     String sfname=file.getName(); 
     String cfname=file.getName(); 
     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 spetak; 
     if (CGeneral.nPetakTetap==CGeneral.ACTIVITY_FOR_PETAK){ 
      url = CGlobalConfig.getURLRcvrPetak(); 
      spetak="petak"; 
     } 
     else{ 
      url = CGlobalConfig.getURLRcvrPeliharaImage(); 
      spetak="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, spetak+"_"+cfname); 
      MultipartEntity reqEntity = new MultipartEntity(
      HttpMultipartMode.BROWSER_COMPATIBLE); 
      reqEntity.addPart("image", bab); 
      reqEntity.addPart("category", new StringBody(spetak)); 
      reqEntity.addPart("foto", new StringBody(spetak+"_"+cfname));// 
      reqEntity.addPart("tgl", new StringBody(sdat));// 
      reqEntity.addPart("lat_petak", new StringBody(slat));// 
      reqEntity.addPart("lon_petak", new StringBody(slon));// 
      reqEntity.addPart("accuracy", new StringBody(sacc)); 
      reqEntity.addPart("jenis_hama", new StringBody(jnsHm));// 
      reqEntity.addPart("jumlah_hama", new StringBody(jmlHm));// 
      reqEntity.addPart("jenis_musuh", new StringBody(jnsMsh));// 
      reqEntity.addPart("jumlah_musuh", new StringBody(jmlMsh));// 
      reqEntity.addPart("int_serangan", new StringBody(intens));// 
      reqEntity.addPart("luas_terancam", new StringBody(luasAncam));// 
      reqEntity.addPart("nama_petak", new StringBody(nmPetak));// 
      reqEntity.addPart("code_db", new StringBody(code));// 
      reqEntity.addPart("user_id", new StringBody(userId));// 
      reqEntity.addPart("varietas", new StringBody(varietas));// 
      reqEntity.addPart("lon_db", new StringBody(dbLon));// 
      reqEntity.addPart("lat_db", new StringBody(dbLat));// 

      httppost.setEntity(reqEntity); 
      HttpResponse response = httpclient.execute(httppost); 
      ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
      String response2 = httpclient.execute(httppost, responseHandler); 
      //if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
      final String reverseString = response2; 
      runOnUiThread(new Runnable() { 
        public void run() { 
         Toast.makeText(UpdateLog.this, "response : " + reverseString, Toast.LENGTH_LONG).show(); 
        } 
       }); 
      entity = response.getEntity(); 
      //} 

     } 

     catch (final ClientProtocolException e) { 
      runOnUiThread(new Runnable() { 
        public void run() { 
         Toast.makeText(UpdateLog.this, "CPE response " + e.toString(), Toast.LENGTH_LONG).show(); 
        } 
       }); 
     // TODO Auto-generated catch block 
     } catch (final IOException e) { 
      runOnUiThread(new Runnable() { 
        public void run() { 
         Toast.makeText(UpdateLog.this, "IOE response " + e.toString(), Toast.LENGTH_LONG).show(); 
        } 
       }); 
     // TODO Auto-generated catch block 
     } 
     catch (Exception e) { 
      Log.e(e.getClass().getName(), e.getMessage()); 
     } 
     String temp = null; 

     try { 

      if(entity == null){ 
       publishProgress(0,"Send Fail"); 
       SystemClock.sleep(500); 
       return false; 
      } 
      else{ 
      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;    
     } 

    } 

и вот мой LogCat

03-28 00:38:43.421: ERROR/AndroidRuntime(3028): FATAL EXCEPTION: AsyncTask #2 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028): java.lang.RuntimeException: An error occured while executing doInBackground() 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  at java.lang.Thread.run(Thread.java:1019) 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028): Caused by: java.lang.NullPointerException 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  at hariff.ltis.petaktetap.UpdateLog$MyAsyncTaskPetak.SendDataFoto(UpdateLog.java:961) 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  at hariff.ltis.petaktetap.UpdateLog$MyAsyncTaskPetak.doInBackground(UpdateLog.java:814) 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  at hariff.ltis.petaktetap.UpdateLog$MyAsyncTaskPetak.doInBackground(UpdateLog.java:1) 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
03-28 00:38:43.421: ERROR/AndroidRuntime(3028):  ... 4 more 

ошибка в строке if (temp.compareTo("SUCCESS") == 0) {

, как исправить это ?, я хочу выпить, и сообщение об ошибке, это показать вместе, когда данные передаются.

+0

Был temp инициализирован? – dannyroa

ответ

0

В здесь:

if(entity == null){ 
    publishProgress(0,"Send Fail"); 
    SystemClock.sleep(500); 
    return false; 
} 

Он появляется исключение, которое предотвращает запуск кода return false. Исключение поймано, но temp все еще не инициализировано. Таким образом, вы видите NullPointerException несколько строк вниз.

Вы должны увидеть трассировку оранжевого стека из начальной ошибки, устранить ошибку там, и это исключение NullPointerException больше не будет проблемой. (Вы также можете добавить return false; в свой улов блоков.

Наконец я предполагаю SystemClock.sleep(500); проблема, блокируя любую нить не нужна, вы должны использовать обработчик и Runnable для запуска кода после задержки.

Смежные вопросы