我知道我不应该在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
}
}
答案 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
变量,但是没有告诉我们它是如何实例化的。我会赌博这个是你的问题。