HttpResponse response = httpclient.execute(httppost);不适用于Android 4甚至没有ASYNCTASK

时间:2012-11-27 21:53:10

标签: android android-asynctask http-post runtime-error

我知道我不应该在UI线程上运行网络相关的东西,因此我使用asynctask通过远程服务器上的php从数据库中读取一些东西。 但是,当代码到达--HttpResponse response = httpclient.execute(httppost); - 我收到错误 - java.lang.IndexOutOfBoundsException:索引0无效,大小为0 - 因此代码不起作用。

请注意我正在调用asyncTask - new dataRetrievalViaAsyncTask()。execute(url,url,url); (第二个和第三个'url'是虚拟的,因为它们没有被使用) - 在oncreate()内部。

那里有什么问题?

class dataRetrievalViaAsyncTask extends AsyncTask<String, String, String>
{
    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... f_url)
    {
        Log.i("tag", "inside doInBackground");
        String url2 = f_url[0];
        Log.i("tag", url2);

        HttpClient httpclient = new DefaultHttpClient();
        Log.i("tag",    "done : HttpClient httpclient = new DefaultHttpClient();");

        HttpPost httppost = new HttpPost(url2);
        Log.i("tag", "done : HttpPost httppost = new HttpPost(url);");

        try
        {

            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            Log.i("tag",    "done : httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));");
            HttpResponse response = httpclient.execute(httppost);
            Log.i("tag",    "done : HttpResponse response = httpclient.execute(httppost);");
            HttpEntity entity = response.getEntity();
            Log.i("tag",    "done : HttpEntity entity = response.getEntity();");
            is = entity.getContent();
            Log.i("tag", "after : is = entity.getContent();");

        } catch (Exception e)
        {
            Log.e("log_tag", "Error in http connection" + e.toString());
        }
        // convert response to string
        return "a";

    }

    @Override
    protected void onPostExecute(String result)
    {
               // enter code here

    }
}

1 个答案:

答案 0 :(得分:1)

为了避免进一步的混乱,请执行以下操作:

class dataRetrievalViaAsyncTask extends AsyncTask<String, Void, Void>
{

显示你没有使用其他变种。

所以你会这样做:

 dataRetrievalViaAsyncTask().execute(url, null, null);

然后在你的catch块中改为:

 catch (Exception e)
    {
        Log.e("log_tag", "Error in http connection", e);
    }

然后你将获得正确的堆栈跟踪,希望能够使用类/方法名称和行号进行调试。

我假设你的清单中有INTERNET权限。

唯一可以拥有ArrayIndexOutOfBounds的地方是:

 String url2 = f_url[0];

意味着您没有正确地将字符串URL发送到ASyncTask。

另一个问题是你使用的是nameValuePairs变量,但是没有告诉我们它是如何实例化的。我会赌博这个是你的问题。