2011-07-27 57 views
2

我有輸入表單在我的Android應用程序 在輸入的數據將保存到在線數據庫HTTP POST成功,但AsyncTask返回NullPointerException?

現在我可以保存數據,並使用的AsyncTask上傳的圖片。

數據上傳成功,但返回的AsyncTask顯示java.lang.NullPointerException

,這裏是我的AsyncTask類:

private class SaveAsetData extends AsyncTask<String, Void, String>{ 

    ProgressDialog pd = new ProgressDialog(FormAsetTambah.this); 

    BufferedReader in = null; 

    final TextView errorText = (TextView) findViewById(R.id.error_text); 

    protected void onPreExecute(){ 
     pd.setMessage(Functions.GetString(getApplicationContext(), R.string.progress_dialog_loading)); 
     pd.show(); 
    } 

    @Override 
    protected String doInBackground(String... arg0) { 

     try { 

      String URL_DESTINATION = URLVariables.get_base_url()+"aset_tambah_pic.php"; 

      Bitmap bm = BitmapFactory.decodeFile(arg0[7]); 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      bm.compress(CompressFormat.JPEG, 50, bos); 

      HttpClient httpClient = CustomHttpClient.getHttpClient(); 
      HttpPost postRequest = new HttpPost(URL_DESTINATION);   

      MultipartEntity reqEntity = new MultipartEntity(
      HttpMultipartMode.BROWSER_COMPATIBLE); 
      reqEntity.addPart("uploadedfile", new FileBody(new File(arg0[7]))); 
      reqEntity.addPart("nama", new StringBody(arg0[0])); 
      reqEntity.addPart("detail", new StringBody(arg0[1])); 
      reqEntity.addPart("keterangan", new StringBody(arg0[2])); 
      reqEntity.addPart("longitude", new StringBody(arg0[3])); 
      reqEntity.addPart("latitude", new StringBody(arg0[4])); 
      reqEntity.addPart("kategori", new StringBody(arg0[5])); 
      reqEntity.addPart("daerah", new StringBody(arg0[6])); 
      postRequest.setEntity(reqEntity); 

      HttpResponse response = httpClient.execute(postRequest); 

      in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 

      StringBuffer sb = new StringBuffer(""); 
      String line = ""; 
      String NL = System.getProperty("line.separator"); 

      while((line = in.readLine()) != null){ 
       sb.append(line+NL); 
      } 

      in.close(); 

      String result = sb.toString(); 

      return result; 

     }catch(Exception e){    
      return e.toString(); 
     } 

    } 

    protected void onPostExecute(String result){ 

     try{ 

      String output = result.toString().trim(); 
      error_text.setText(output); 

      if(output.equals("1")){ 
       Functions.MakeToast(getApplicationContext(), ERR_SAVED); 
       Intent daftarAset = new Intent(getApplicationContext(), DaftarAset.class); 
       startActivity(daftarAset); 
       finish(); 
      }else if(output.equals("2")){ 
       Functions.MakeToast(getApplicationContext(), ERR_QUERY); 
      }else{ 
       Functions.MakeToast(getApplicationContext(), ERR_HTTPFAIL); 
      } 

     }catch(Exception e){ 
      Functions.MakeToast(getApplicationContext(), "onPostExecute fail : "+e.toString()); // it failed here 
     } 
     pd.dismiss(); 
    } 

} 

你知道是我的錯嗎? 或任何建議/解決方案,使其更好?

感謝

更新

這是我在logcat的例外

07-27 21:54:09.222: WARN/System.err(17600): java.lang.NullPointerException 
07-27 21:54:09.222: WARN/System.err(17600):  at com.ngimagrid.nigmago.FormAsetTambah$SaveData.onPostExecute(FormAsetTambah.java:567) 
07-27 21:54:09.222: WARN/System.err(17600):  at com.ngimagrid.nigmago.FormAsetTambah$SaveData.onPostExecute(FormAsetTambah.java:1) 
07-27 21:54:09.222: WARN/System.err(17600):  at android.os.AsyncTask.finish(AsyncTask.java:417) 
07-27 21:54:09.222: WARN/System.err(17600):  at android.os.AsyncTask.access$300(AsyncTask.java:127) 
07-27 21:54:09.222: WARN/System.err(17600):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
07-27 21:54:09.222: WARN/System.err(17600):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-27 21:54:09.222: WARN/System.err(17600):  at android.os.Looper.loop(Looper.java:123) 
07-27 21:54:09.222: WARN/System.err(17600):  at android.app.ActivityThread.main(ActivityThread.java:3687) 
07-27 21:54:09.222: WARN/System.err(17600):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-27 21:54:09.222: WARN/System.err(17600):  at java.lang.reflect.Method.invoke(Method.java:507) 
07-27 21:54:09.222: WARN/System.err(17600):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
07-27 21:54:09.222: WARN/System.err(17600):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
07-27 21:54:09.222: WARN/System.err(17600):  at dalvik.system.NativeStart.main(Native Method) 

UPDATE

這裏是我的服務器端代碼:

<?php 

    require_once("functions.php"); 

    $nama = trim($_POST['nama']); 
    $detail = trim($_POST['detail']); 
    $keterangan = trim($_POST['keterangan']); 
    $longitude= trim($_POST['longitude']); 
    $latitude = trim($_POST['latitude']); 

    $kategori = trim($_POST['kategori']); 
    $daerah = trim($_POST['daerah']); 

    $target_path = "images/"; 
    $file_tmp_name = $_FILES['uploadedfile']['tmp_name']; 
    $file_name = str_replace(array(" ","-"), "_", strtolower(basename($_FILES['uploadedfile']['name']))); 
    $target_path = $target_path.$file_name; 


    if(empty($nama) || empty($detail) || empty($keterangan) || empty($longitude) || empty($latitude) || empty($kategori) || empty($daerah) || empty($file_tmp_name)){ 

     echo "5"; 

    }else{ 

     openDB(); 

     $get_id_kategori = mysql_fetch_array(mysql_query("SELECT `id_kategori` FROM `aset_kategori` WHERE `kategori`='$kategori'")); 
     $get_id_daerah = mysql_fetch_array(mysql_query("SELECT `id_daerah` FROM `aset_daerah` WHERE `daerah`='$daerah'")); 

     $tanggal = date("Y-m-d H:i:s"); 

     $sql = "INSERT INTO `aset` (`id_aset` ,`id_daerah` ,`id_kategori` ,`nama` ,`detail` ,`longitude` ,`latitude` ,`keterangan` ,`status` ,`tanggal`) 
        VALUES (NULL , '$get_id_daerah[0]', '$get_id_kategori[0]', '$nama', '$detail', '$longitude', '$latitude', '$keterangan', 'Y', '$tanggal');"; 

     if(mysql_query($sql)){ 
      if(!file_exists($target_path)){ 
       if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 

        $id_aset = mysql_fetch_array(mysql_query("SELECT `id_aset` FROM `aset` ORDER BY `id_aset` DESC LIMIT 1")); 
        mysql_query("INSERT INTO `aset_foto` (`id_foto`, `id_aset`, `foto`) VALUES (NULL, '$id_aset[0]', '$file_name');"); 

        echo "1"; // success   
       } else{   
        echo "2"; // failed   
       } 
      }else{ 
       echo "3"; // failed 
      } 
     }else{ 
      echo "4"; //failed 
     } 

     closeDB(); 

    } 

?> 

如果響應等於1,則節省proccess成功

+0

在你的catch塊(e.printStackTrace();)中打印一個堆棧跟蹤並將其發佈到這裏,它會更容易幫助 –

+0

我可以從printStackTrace ()? – Falmesino

+0

從LogCat複製異常http://stackoverflow.com/questions/3280051/how-to-enable-logcat-console-in-eclipse-for-android – Selvin

回答

1

在你的IDE或任何後裔文本編輯器打開你轉到線的功能。輸入567,這就是失敗的行號。不幸的是,如果沒有實際的完整源代碼,我們就無法知道這個片段中出現了什麼行號567。

,看起來問題嫌疑人可能是線路:

String output = result.toString().trim(); 
error_text.setText(output); 

結果可能爲空,或toString()方法可以返回null。 error_text也可以爲null。

+0

你是對的,這就是行567 我認爲doInBackground的結果爲空,我已經在服務器端測試過它,但是它工作正常,但是爲什麼在android應用程序中它不會返回任何結果? – Falmesino

+0

嘗試記錄看看服務器端的輸出是怎樣的 –

+0

你的doInBackground()中的異常塊沒有做什麼ULD。問題是你正在返回e.toString(),這永遠不會有意義,因爲你的doPostExecute()不能區分有效響應和異常。例外意味着出了問題,你應該停下來。讓這個異常沸騰或將其設置爲一個實例變量。然後在onPostExecute()查看實例變量並顯示警報。我敢打賭,你在被困的doBackground()中有一個NPE,並且NPE.getMessage()返回null,因此你有一個null傳遞給onPostExecute()。 – chubbsondubs

1

我想我明白了。 我建議你在你的doInBackground()方法下return in.readline().trim();(也可以不修剪)

爲什麼?因爲在你的腳本,你是echo -ing只有一個字符(甚至可.read()來完成,所以沒有必要通過InputStreamReader對象進行迭代。

onPostExecute()方法,我建議Logresult,看看有什麼它與價值,在你做任何事情之前。

相關問題