我是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)
=============================================== ====================
答案 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)
这意味着你没有传递一个参数......在这里你去