Android HttpClient,HttpPost和AsyncTask致命异常#1

时间:2013-06-12 15:03:22

标签: android android-asynctask

我是Android上的新手,我正在开发一个将一些信息发布到php脚本的应用程序但是我得到了太多例外。

这是我的代码:

 package com.example.testapp;

import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;

import android.content.Context;
import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.Toast;

public class HttpTraitement extends AsyncTask<HttpClient, Integer, HttpResponse> {

    private Context context;

    public HttpTraitement (Context context) 
    {
        this.context = context;     
    }

    @Override
    protected HttpResponse doInBackground(HttpClient... params) {
        // TODO Auto-generated method stub
        HttpResponse response = null;
        params[0] = new DefaultHttpClient();


        HttpPost httppost = new HttpPost("http://namedomain/test.php");


        try {
            response = params[0].execute(httppost); 

        } catch (ClientProtocolException e) {
            Toast.makeText(this.context, "Caught ClientProtocolException", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            Toast.makeText(this.context, "Caught IOException", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            Toast.makeText(this.context, "Exception", Toast.LENGTH_SHORT).show();                  
        }

        return response;

    }






}

LogCat Stack:

06-12 14:54:01.455: E/Trace(1244): error opening trace file: No such file or directory (2)
06-12 14:54:04.166: E/AndroidRuntime(1244): FATAL EXCEPTION: AsyncTask #1
06-12 14:54:04.166: E/AndroidRuntime(1244): java.lang.RuntimeException: An error occured while executing doInBackground()
06-12 14:54:04.166: E/AndroidRuntime(1244):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.lang.Thread.run(Thread.java:856)
06-12 14:54:04.166: E/AndroidRuntime(1244): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
06-12 14:54:04.166: E/AndroidRuntime(1244):     at com.example.testapp.HttpTraitement.doInBackground(HttpTraitement.java:29)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at com.example.testapp.HttpTraitement.doInBackground(HttpTraitement.java:1)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at 
android.os.AsyncTask$2.call(AsyncTask.java:287)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)

=============================================== ====================

3 个答案:

答案 0 :(得分:2)

execute()上调用AsyncTask时,您没有传递任何参数(因此params的长度为 0 )。
然后在{ {1}}您尝试将doInBackground放入位置0的DefaultHttpClient数组中,但该位置不存在。

params参数是这样你可以将参数传递给params来执行。你不应该在AsyncTask内改变它 - 你应该把它当作只读。

答案 1 :(得分:1)

我怀疑这是你想要调用异步任务的方式:

HttpTraitement task = new HttpTraitement(this);
task.execute("http://namedomain/test.php");

为此,您必须通过以下方式更改异步任务:

public class HttpTraitement extends AsyncTask<String, Integer, HttpResponse> {

    private Context context;

    public HttpTraitement (Context context) 
    {
        this.context = context;     
    }

    @Override
    protected HttpResponse doInBackground(String... params) {
        HttpResponse response = null;
        HttpPost httppost = new HttpPost(params[0]);

        try {
            HttpClient client = new DefaultHttpClient();
            response = client.execute(httppost); 

        } catch (ClientProtocolException e) {
            Toast.makeText(this.context, "Caught ClientProtocolException", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            Toast.makeText(this.context, "Caught IOException", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            Toast.makeText(this.context, "Exception", Toast.LENGTH_SHORT).show();                  
        }

        return response;

    }

}

请注意,每个异步任务对象只能调用一次方法execute()。因此,如果要为多个URL调用它,则必须执行以下操作:

HttpTraitement task1 = new HttpTraitement(this);
task1.execute("http://namedomain/test1.php");
HttpTraitement task2 = new HttpTraitement(this);
task2.execute("http://namedomain/test2.php");

答案 2 :(得分:0)

为了调用异步任务,你必须在MainClass中创建一个类Httptraitement的新对象

HttpTraitement http=new HttpTraitement();

然后你必须执行一个asyncTask路径params,在你的情况下HttpClient params;

HttpClient client= new DefaultHttpClient();
htt.execute(client);

在你的日志中:

 06-12 14:54:04.166: E/AndroidRuntime(1244): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
06-12 14:54:04.166: E/AndroidRuntime(1244):     at com.example.testapp.HttpTraitement.doInBackground(HttpTraitement.java:29)

这意味着你没有传递一个参数......在这里你去