AsyncTask doInBackground错误

时间:2014-02-23 15:57:23

标签: android json

我正在尝试将项目发布到数据库中,但我遇到了AsynTask的致命异常。一直试图找到一个解决方案很长一段时间,但仍然无法解决它。我已经在清单中添加了互联网权限。

这是logcat:

02-23 10:38:24.216: E/AndroidRuntime(2202): FATAL EXCEPTION: AsyncTask #1
02-23 10:38:24.216: E/AndroidRuntime(2202): java.lang.RuntimeException: An error occured while executing doInBackground()
02-23 10:38:24.216: E/AndroidRuntime(2202):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
02-23 10:38:24.216: E/AndroidRuntime(2202):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
02-23 10:38:24.216: E/AndroidRuntime(2202):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
02-23 10:38:24.216: E/AndroidRuntime(2202):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
02-23 10:38:24.216: E/AndroidRuntime(2202):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
02-23 10:38:24.216: E/AndroidRuntime(2202):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
02-23 10:38:24.216: E/AndroidRuntime(2202):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
02-23 10:38:24.216: E/AndroidRuntime(2202):     at java.lang.Thread.run(Thread.java:841)
02-23 10:38:24.216: E/AndroidRuntime(2202): Caused by: java.lang.NullPointerException
02-23 10:38:24.216: E/AndroidRuntime(2202):     at my.fyp.inticlassifieds.PostItemForm$CreateNewProduct.doInBackground(PostItemForm.java:103)
02-23 10:38:24.216: E/AndroidRuntime(2202):     at my.fyp.inticlassifieds.PostItemForm$CreateNewProduct.doInBackground(PostItemForm.java:1)
02-23 10:38:24.216: E/AndroidRuntime(2202):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
02-23 10:38:24.216: E/AndroidRuntime(2202):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
02-23 10:38:24.216: E/AndroidRuntime(2202):     ... 4 more
02-23 10:38:24.866: I/Choreographer(2202): Skipped 61 frames!  The application may be doing too much work on its main thread.
02-23 10:38:25.616: I/Choreographer(2202): Skipped 54 frames!  The application may be doing too much work on its main thread.
02-23 10:38:27.246: E/WindowManager(2202): Activity my.fyp.inticlassifieds.PostItemForm has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b12d87c8 V.E..... R.....ID 0,0-729,192} that was originally added here
02-23 10:38:27.246: E/WindowManager(2202): android.view.WindowLeaked: Activity my.fyp.inticlassifieds.PostItemForm has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b12d87c8 V.E..... R.....ID 0,0-729,192} that was originally added here
02-23 10:38:27.246: E/WindowManager(2202):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:345)
02-23 10:38:27.246: E/WindowManager(2202):  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:239)
02-23 10:38:27.246: E/WindowManager(2202):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
02-23 10:38:27.246: E/WindowManager(2202):  at android.app.Dialog.show(Dialog.java:281)
02-23 10:38:27.246: E/WindowManager(2202):  at my.fyp.inticlassifieds.PostItemForm$CreateNewProduct.onPreExecute(PostItemForm.java:92)
02-23 10:38:27.246: E/WindowManager(2202):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
02-23 10:38:27.246: E/WindowManager(2202):  at android.os.AsyncTask.execute(AsyncTask.java:534)
02-23 10:38:27.246: E/WindowManager(2202):  at my.fyp.inticlassifieds.PostItemForm$1.onClick(PostItemForm.java:72)
02-23 10:38:27.246: E/WindowManager(2202):  at android.view.View.performClick(View.java:4240)
02-23 10:38:27.246: E/WindowManager(2202):  at android.view.View$PerformClick.run(View.java:17721)
02-23 10:38:27.246: E/WindowManager(2202):  at android.os.Handler.handleCallback(Handler.java:730)
02-23 10:38:27.246: E/WindowManager(2202):  at android.os.Handler.dispatchMessage(Handler.java:92)
02-23 10:38:27.246: E/WindowManager(2202):  at android.os.Looper.loop(Looper.java:137)
02-23 10:38:27.246: E/WindowManager(2202):  at android.app.ActivityThread.main(ActivityThread.java:5103)
02-23 10:38:27.246: E/WindowManager(2202):  at java.lang.reflect.Method.invokeNative(Native Method)
02-23 10:38:27.246: E/WindowManager(2202):  at java.lang.reflect.Method.invoke(Method.java:525)
02-23 10:38:27.246: E/WindowManager(2202):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
02-23 10:38:27.246: E/WindowManager(2202):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-23 10:38:27.246: E/WindowManager(2202):  at dalvik.system.NativeStart.main(Native Method)

以下是代码:

public class PostItemForm extends Activity {

    // Progress Dialog
    private ProgressDialog pDialog;

    JSONParser jsonParser = new JSONParser();
    EditText itemName;
    EditText itemPrice;
    EditText itemDesc;
    Spinner itemCat;

    // url to create new product
    private static String url_create_product = "http://inticlassifields.comze.com/public_html/phpscripts/post_item.php";

    // JSON Node names
    private static final String TAG_SUCCESS = "success";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_post_item_form);

        // Edit Text
        itemName = (EditText) findViewById(R.id.i_itemname);
        itemPrice = (EditText) findViewById(R.id.i_price);
        itemDesc = (EditText) findViewById(R.id.i_des);

        itemCat = (Spinner) findViewById(R.id.spinner1);
        // Create an ArrayAdapter using the string array and a default spinner layout
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                R.array.item_cat, android.R.layout.simple_spinner_item);
        // Specify the layout to use when the list of choices appears
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // Apply the adapter to the spinner
        itemCat.setAdapter(adapter);

        // Create button
        Button btnCreateProduct = (Button) findViewById(R.id.submitpostitem);

        // button click event
        btnCreateProduct.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // creating new product in background thread
                new CreateNewProduct().execute();
            }
        });
    }

    /**
     * Background Async Task to Create new product
     * */
    class CreateNewProduct extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(PostItemForm.this);
            pDialog.setMessage("Posting item..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        /**
         * Creating product
         * */
        protected String doInBackground(String... args) {
            String date_posted = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
            String name = itemName.getText().toString();
            String price = itemPrice.getText().toString();
            String description = itemDesc.getText().toString();
            String category = itemCat.getSelectedItem().toString();

            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("name", name));
            params.add(new BasicNameValuePair("price", price));
            params.add(new BasicNameValuePair("date", date_posted));
            params.add(new BasicNameValuePair("description", description));
            params.add(new BasicNameValuePair("category", category));

            // getting JSON Object
            // Note that create product url accepts POST method
            JSONObject json = jsonParser.makeHttpRequest(url_create_product,
                    "POST", params);

            // check log cat from response
            Log.d("Create Response", json.toString());

            // check for success tag
            try {
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // successfully created product
                    Toast.makeText(PostItemForm.this,"Item posted", Toast.LENGTH_LONG).show();


                    // closing this screen
                    finish();
                } else {
                    // failed to create product
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }


        protected void onPostExecute(String file_url) {
            // dismiss the dialog once done
            pDialog.dismiss();
        }

    }
    }

我修复了nullpointerexception但现在我正面临着我的json的另一个问题。这是什么类型的错误?

02-24 03:07:36.478: E/JSON(2309): <br><table border='1' cellpadding='2' bgcolor='#FFFFDF' bordercolor='#E8B900' align='center'><tr><td><font face='Arial' size='1' color='#000000'><b>PHP Error Message</b></font></td></tr></table><br /> 02-24 03:07:36.478: E/JSON(2309): <b>Warning</b>: require_once(include/DB_Functions.php) [<a href='function.require-once'>function.require-once</a>]: failed to open stream: No such file or directory in <b>/home/a3335925/public_html/phpscripts/index.php</b> on line <b>17</b><br /> 02-24 03:07:36.478: E/JSON(2309): <br><table border='1' cellpadding='2' bgcolor='#FFFFDF' bordercolor='#E8B900' align='center'><tr><td><div align='center'><a href='http://www.000webhost.com/'><font face='Arial' size='1' color='#000000'>Free Web Hosting</font></a></div></td></tr></table><br><table border='1' cellpadding='2' bgcolor='#FFFFDF' bordercolor='#E8B900' align='center'><tr><td><font face='Arial' size='1' color='#000000'><b>PHP Error Message</b></font></td></tr></table><br /> 02-24 03:07:36.478: E/JSON(2309): <b>Fatal error</b>: require_once() [<a href='function.require'>function.require</a>]: Failed opening required 'include/DB_Functions.php' (include_path='.:/usr/lib/php:/usr/local/lib/php') in <b>/home/a3335925/public_html/phpscripts/index.php</b> on line <b>17</b><br /> 02-24 03:07:36.478: E/JSON(2309): <br><table border='1' cellpadding='2' bgcolor='#FFFFDF' bordercolor='#E8B900' align='center'><tr><td><div align='center'><a href='http://www.000webhost.com/'><font face='Arial' size='1' color='#000000'>Free Web Hosting</font></a></div></td></tr></table> 02-24 03:07:36.478: E/JSON Parser(2309): Error parsing data org.json.JSONException: Value <br><table of type java.lang.String cannot be converted to JSONObject

2 个答案:

答案 0 :(得分:3)

你已经两次声明了你的Spinner,这就是Nul​​l Pointer Error抛出的原因。

如果你看到,在班级你有,

  Spinner itemCat;

然后在你的onCreate中再次拥有,

 Spinner itemCat = //your layout Spinner.

因此,您已初始化了本地Spinner变量itemCat,而在asynctask中,您正在调用仍为null的类级itemCat。

在onCreate中只需更改,

 Spinner itemCat = //your layout Spinner.

itemCat = //your layout Spinner.

答案 1 :(得分:1)

您只能从UI线程进行UI更改。您正在doInBackground内创建一个在另一个线程中运行的Toast。您需要使用onPostExecute方法或onProgressUpdated方法创建吐司。

因此,在您的情况下,您应该使doInBackground方法返回将在onPostExceute()中捕获的成功值。在那里你可以检查成功的值是1是否一切正常,如果没有,则检查0,然后在onPostExecute方法上查看返回的值,然后采取行动。