当前位置: 首页 > 知识库问答 >
问题:

Http Post请求android在另一个线程中

郎宣
2023-03-14

我是android新手,我试图发出http post请求,我得到了以下错误,我已经发布了我的代码和我的Logcat的一些行。我应该在另一个类中这样做吗?如果是,如何做,或者只是我必须在当前代码中修复的东西。

public class PasteCode extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pastecode);

    final EditText codeinput = (EditText) findViewById(R.id.editText1);

    Button send_btn = (Button) findViewById(R.id.button1);
    send_btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            final String code = codeinput.getText().toString();

            new Thread( new Runnable() {
                @Override
                public void run() {

                    HttpClient httpClient = new DefaultHttpClient();
                    HttpPost httpPost = new HttpPost("accounts.google.com");

                    ArrayList<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(5);
                    nameValuePair.add(new BasicNameValuePair("code", code));
                    nameValuePair.add(new BasicNameValuePair("client_id", "----------------------"));
                    nameValuePair.add(new BasicNameValuePair("client_secret", "-----------------"));
                    nameValuePair.add(new BasicNameValuePair("redirect_uri", "urn:ietf:wg:oauth:2.0:oob"));
                    nameValuePair.add(new BasicNameValuePair("grant_type", "authorization_code"));

                    try {
                        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));

                    } catch (UnsupportedEncodingException e) {
                        // writing error to Log
                        e.printStackTrace();
                    }

                    // Making HTTP Request
                    try {
                        HttpResponse response = httpClient.execute(httpPost);

                        // writing response to log
                        Log.d("Http Response:", response.toString());
                    } catch (ClientProtocolException e) {
                        // writing exception to log
                        e.printStackTrace();
                    } catch (IOException e) {
                        // writing exception to log
                        e.printStackTrace();

                    }

                }
            }).start();
        }
    });
}
}

logview

02-18 10:03:20.477:W/DalvikVM(3759):ThreadId=15:线程退出,异常未捕获(组=0x4001D760)

02-18 10:03:20.487:e/AndroidRuntime(3759):at java.lang.thread.run(thread.java:1020)

共有1个答案

羊舌兴德
2023-03-14

早上好,你能发布logcat错误吗...实际上,android不允许你在应用程序的主线程中发出http请求...有一些方法可以实现你想要的...首先,您可以将线程实现为AsyncTask...或者只是为了开发的目的,您可以删除这些混杂,您可以在活动的onCreate中将这些行添加到您的代码中...

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

但这不是重组...

编辑:

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
        nameValuePairs.add(new BasicNameValuePair("data1", "data"));
        nameValuePairs.add(new BasicNameValuePair("data2", "dataa"));
        nameValuePairs.add(new BasicNameValuePair("data3", "dataaa"));
        try {
            res = CustomHttpClient.sendData("URL", nameValuePairs);
            String resp = res.toString();
            Log.e(Tag, res);
            resp = resp.replaceAll("\\s+","");
public static final int HTTP_TIMEOT = 30 * 1000;
private static HttpClient mHttpClient;

private static HttpClient getHttpClient() {
    if (mHttpClient == null) ;
    {
        mHttpClient = new DefaultHttpClient();
        final HttpParams param = mHttpClient.getParams();
        HttpConnectionParams.setConnectionTimeout(param, HTTP_TIMEOT);
        HttpConnectionParams.setSoTimeout(param, HTTP_TIMEOT);
        ConnManagerParams.setTimeout(param, HTTP_TIMEOT);
    }
    return mHttpClient;
}

public static String sendData(String url, ArrayList nameValuePairs) throws Exception {
    BufferedReader reader = null;
    try {
        HttpClient httpclient = getHttpClient();
        HttpPost httppost = new HttpPost(url);
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairs);
        httppost.setEntity(formEntity);

        HttpResponse response = httpclient.execute(httppost);
        reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        StringBuffer sBuffer = new StringBuffer("");
        String line = "";
        String NL = System.getProperty("line.separator");
        while ((line = reader.readLine()) != null) {
            sBuffer.append(line + NL);
        }
        reader.close();
        String result = sBuffer.toString();
        return result;
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
 类似资料:
  • 对传递的 URL 发出一个 POST 请求。 使用 XMLHttpRequest web api 对给定的url 发出一个 post 请求。 用 setRequestHeader 方法设置 HTTP 请求头的值。 通过调用给定的 callback 和 responseText 来处理 onload 事件。 通过运行提供的 err 函数,处理onerror事件。 省略第三个参数 data ,不发送数

  • 我尽力描述我的处境。我的wicket站点包含list wicket组件,其中每个列表元素都有另一个列表。最低级别列表中的每个元素都有下载某个文件的ajax wicket链接。这一切都很好。我习惯了这种懒散的行为。此行为的方法startDownload在link onClick方法中调用。

  • 我正在尝试发送一个经过身份验证的请求,只需点击邮递员。 所以,我有一个名为“Oauth”的请求,我正在使用测试将令牌存储在局部变量中。 我现在要做的是,对于需要承载令牌的任何其他请求,自动运行Oauth请求(从预请求脚本)。 有没有一种方法可以通过单击邮递员按钮来获取访问令牌并发送经过身份验证的请求?

  • 假设一个线程组中有2个请求。线程计数为100 Http采样器A,Http采样器B 我使用JSON提取器提取了一组值,并存储在变量中 我在请求采样器b中使用了提取的值(为每个提取的值添加了控制器) 当我尝试执行此脚本时,请求运行了100次 所以我为第一个请求添加了一次唯一的控制器。尽管这两个请求都运行了100次 我想执行请求A一次,请求B 100次。我们怎样才能做到这一点?

  • 问题内容: 我想更改Android中的UI。 我的主类创建第二个类,然后第二个类调用主类的方法。主类中的方法应更新UI,但程序在运行时会崩溃。 我该怎么办? 我的主要班级: 还有我的第二堂课: 问题答案: 您不能从主线程以外的线程调用UI方法。您应该使用Activity#runOnUiThread()方法。

  • 我正在阅读这篇文章,关于从一个线程中断另一个线程的建议是 “”“如果正确实施,以下几种方法应该可以奏效。 您可以让两个线程定期检查一些常见的标志变量(例如,将其称为stopNow),并安排两个线程在完成时进行设置。(标志变量需要是volatile…或正确同步的。) 您可以让两个线程定期调用线程。isInterrupted()方法,查看它是否已被中断。然后每个线程都需要调用线程。完成后,在另一个上中