致命异常:使用JSON时AsyncTask#1

时间:2014-07-28 16:55:53

标签: android json android-asynctask

我是Android编程的新手,我想创建一个非常简单的应用程序,在String中使用EditText,当我点击button时,它需要{{1并将其发送到我的String以将其保存在我的数据库中。

但它为localhost提供了运行时错误,我不明白为什么。求你帮帮我。

这是我的日志:

doInBackground()

我的代码是:

07-28 12:27:21.591: E/AndroidRuntime(2267): FATAL EXCEPTION: AsyncTask #1
07-28 12:27:21.591: E/AndroidRuntime(2267): Process: com.appeight.jsontest, PID: 2267
07-28 12:27:21.591: E/AndroidRuntime(2267): java.lang.RuntimeException: An error occured while  executing doInBackground()
07-28 12:27:21.591: E/AndroidRuntime(2267):     at android.os.AsyncTask$3.done(AsyncTask.java:300)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at java.lang.Thread.run(Thread.java:841)
07-28 12:27:21.591: E/AndroidRuntime(2267): Caused by: java.lang.StringIndexOutOfBoundsException: length=0; index=3
07-28 12:27:21.591: E/AndroidRuntime(2267):     at java.lang.String.indexAndLength(String.java:584)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at java.lang.String.substring(String.java:1449)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at com.appeight.jsontest.JSONParser.makeHttpRequest(JSONParser.java:79)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at com.appeight.jsontest.AddScreen$CreateNewProduct.doInBackground(AddScreen.java:50)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at com.appeight.jsontest.AddScreen$CreateNewProduct.doInBackground(AddScreen.java:1)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
07-28 12:27:21.591: E/AndroidRuntime(2267):     ... 4 more

有人,请帮助,我在这里真的很难受,而且我是新手,所以请原谅我任何愚蠢的错误。

3 个答案:

答案 0 :(得分:1)

你在这里犯的错误很少:

  • doInBackground中,您不应该访问用户界面
  • doInBackground期望字符串结果时,您返回null postExecute

这是一种干净的方式来做同样的事情

public void addToDb(View vvv)
{
    //Get the value from the textView
    name = tv.getText().toString();
    //build Params
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("name", name));

    CreateNewProduct productTask = new CreateNewProduct(params);
    productTask.execute();
}

class CreateNewProduct extends AsyncTask<String, String, JSONObject>
{
    List<NameValuePair> params;

    public CreateNewProduct(List<NameValuePair> params){
      this.params = params;
    }

    protected JSONObject doInBackground(String... args)
    {

        JSONObject json = jsonParser.makeHttpRequest(add_name,"POST", this.params);

        return json;
    }

    protected void onPostExecute(JSONObject result)
    {
        //this assumes that the response looks like this:
        //{"success" : true }
        boolean success = result.getBoolean("success");
        Toast.makeText(getBaseContext(), success ? "Successful" : "Failure", Toast.LENGTH_SHORT).show();     
    }
}

答案 1 :(得分:0)

使用try环绕doInBackground的内容并捕获异常,并且不要忘记使用以下命令关闭对话框: pDialog.dismiss(); 在onPostExecute()

答案 2 :(得分:0)

com.appeight.jsontest.JSONParser对象访问长度为0的字符串,但它正在尝试访问索引3.这是您编写的类还是库?如果你写了一个类,试着找出原因(检查其中的行代码)。

07-28 12:27:21.591: E/AndroidRuntime(2267): Caused by: java.lang.StringIndexOutOfBoundsException: length=0; index=3
07-28 12:27:21.591: E/AndroidRuntime(2267):     at java.lang.String.indexAndLength(String.java:584)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at java.lang.String.substring(String.java:1449)
07-28 12:27:21.591: E/AndroidRuntime(2267):     at com.appeight.jsontest.JSONParser.makeHttpRequest(JSONParser.java:79)