使用asynctask java.util.concurrent.TimeoutException的Android HTTP POST
//Global.java使用asynctask java.util.concurrent.TimeoutException的Android HTTP POST,java,android,concurrency,delay,Java,Android,Concurrency,Delay,//Global.java package global; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import org.apache.http.HttpEntity; import
package global;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import android.content.Context;
import android.os.AsyncTask;
public class Global{
public static final String TLD = "local";
public static final String SERVER = "http://m.server."+TLD+"/";
public static final String POST_ADD = SERVER+"post";
public static final String REQUEST_ADD = SERVER+"request";
public static Context app_context = null;
public static class post_to_server extends AsyncTask<ArrayList<NameValuePair>, String, String>{
public String response_from_server = "";
@Override
protected String doInBackground(ArrayList<NameValuePair>... params){
try{
HttpParams param = new BasicHttpParams();
param.setParameter("reference", "x");
param.setBooleanParameter("http.protocol.expect-continue", false);
param.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpPost http_post = new HttpPost(Global.POST_ADD);
http_post.setEntity(new UrlEncodedFormEntity(params[0], HTTP.UTF_8));
http_post.setParams(param);
HttpClient http_client = new DefaultHttpClient();
try{
HttpResponse http_response = http_client.execute(http_post);
HttpEntity http_entity = http_response.getEntity();
InputStreamReader input_stream = new InputStreamReader(http_entity.getContent());
BufferedReader buffer_reader = new BufferedReader(input_stream);
String buffer;
while ((buffer = buffer_reader.readLine()) != null) {
response_from_server+= buffer;
publishProgress();
}
}catch(ClientProtocolException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}catch(Exception e){
e.printStackTrace();
}
return response_from_server;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
@Override
protected void onPreExecute(){
super.onPreExecute();
}
@Override
protected void onProgressUpdate(String... values) {
}
}
public static class is_connected extends AsyncTask<String, String, Boolean> {
protected Boolean doInBackground(String... urls) {
boolean response = false;
try{
URL url = new URL(Global.SERVER);
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(3000);
urlc.connect();
if (urlc.getResponseCode() == 200) {
response = true;
}
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
@Override
protected void onProgressUpdate(String... values) {
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
}
@Override
protected void onPreExecute(){
super.onPreExecute();
}
}
}
//错误日志
05-03 22:00:49.740: W/System.err(2094): java.util.concurrent.TimeoutException
05-03 22:00:49.756: W/System.err(2094): at java.util.concurrent.FutureTask.get(FutureTask.java:176)
05-03 22:00:49.757: W/System.err(2094): at android.os.AsyncTask.get(AsyncTask.java:503)
05-03 22:00:49.757: W/System.err(2094): at com.website.Login$login_web.doInBackground(Login.java:349)
05-03 22:00:49.757: W/System.err(2094): at com.website.Login$login_web.doInBackground(Login.java:1)
05-03 22:00:49.757: W/System.err(2094): at android.os.AsyncTask$2.call(AsyncTask.java:288)
05-03 22:00:49.757: W/System.err(2094): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
05-03 22:00:49.758: W/System.err(2094): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
05-03 22:00:49.758: W/System.err(2094): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-03 22:00:49.758: W/System.err(2094): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-03 22:00:49.758: W/System.err(2094): at java.lang.Thread.run(Thread.java:818)
我不明白我做错了什么?我的应用程序每次运行时都会崩溃
Response = new JSONObject(post.get(30, TimeUnit.Seconds));
PHP输出
{"string":{"1":"hello","2":"world"},"int":1}
我可以通过延迟响应从PHP获得响应,如果我注释掉android的响应代码,您应该等待AsyncTask完成它的工作。使用onPostExecute调用外部方法,并在该方法内部获取JSONObject
Response = new JSONObject(post.get(30, TimeUnit.Seconds));
将该语句一分为二,并检查post.get()的返回值是否为null,然后再将其用于不需要null文本指针的新JSONObject。这是不同的。。。在post.execute之后,不能使用post.get(),因为异步任务只能执行一次。。但是post.get()是个坏主意,因为它在UI线程上运行。您在尝试在AsyncTask的doInBackground中启动另一个AsyncTask时,出现了非常错误的代码。
post=new Global.post_to_server()
请重命名该AsyncTask。将带有(异步)任务的内容放入其中,这样人们就会立即看到您确实尝试启动另一个异步任务。
{"string":{"1":"hello","2":"world"},"int":1}
Response = new JSONObject(post.get(30, TimeUnit.Seconds));