Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用asynctask java.util.concurrent.TimeoutException的Android HTTP POST_Java_Android_Concurrency_Delay - Fatal编程技术网

使用asynctask java.util.concurrent.TimeoutException的Android HTTP POST

使用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

//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 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));