HTTP POST успешен, но AsyncTask возвращает NullPointerException? - PullRequest
2 голосов
/ 27 июля 2011

У меня есть форма ввода в моем приложении Android введенные данные будут сохранены в онлайн базе данных

Теперь я могу сохранить данные и загрузить изображение с помощью 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, то процесс сохранения был успешным

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Я думаю, что понял. Я предлагаю в вашем doInBackground() методе return in.readline().trim(); (также попробуйте без обрезки)

Почему? Потому что в вашем скрипте вы echo используете только один символ (что можно сделать даже с .read(), поэтому нет необходимости перебирать объект InputStreamReader.

В методе onPostExecute() я предлагаю Log result и посмотреть, что это со значением, прежде чем что-либо делать.

1 голос
/ 27 июля 2011

При открытии функциональности линии GoTo в вашей IDE или любом текстовом редакторе спуска.Введите 567, и это номер строки, которая не работает.К сожалению, без фактического полного источника мы не можем сказать, какая строка 567 встречается в этом фрагменте.

Строки, которые выглядят подозрительными к проблемам, могут быть:

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

Результатом может бытьnull или toString () может возвращать null.error_text также может быть нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...