Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.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
Java Http请求错误可以';t在未调用Looper.prepare()的线程内创建处理程序_Java_Android_Http - Fatal编程技术网

Java Http请求错误可以';t在未调用Looper.prepare()的线程内创建处理程序

Java Http请求错误可以';t在未调用Looper.prepare()的线程内创建处理程序,java,android,http,Java,Android,Http,我试图发布http请求,我使用了线程和异步任务来避免这个erorr 原因:android.os.NetworkOnMainThreadException 但我有一个新的错误: 无法在未调用Looper.prepare()的线程内创建处理程序。 当我使用这个代码时 Thread th = new Thread(new Runnable() { @Override public void run() { Toast.makeText(Mai

我试图发布http请求,我使用了线程和异步任务来避免这个erorr

原因:android.os.NetworkOnMainThreadException

但我有一个新的错误:

无法在未调用Looper.prepare()的线程内创建处理程序。

当我使用这个代码时

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

            Toast.makeText(MainActivity.this,"loop",Toast.LENGTH_LONG).show();
            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost("https://api.twitter.com/1.1/statuses/update.json");
            post.setHeader("Authorization","OAuth realm=\"https://api.twitter.com/1.1/statuses/update.json\",status=\"aay%20from%20pstman8\",oauth_consumer_key=\"xx\",oauth_token=\"xx\",oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"1420004144\",oauth_nonce=\"2neFPPabcd2neFPPabcd2neFPPabcdqq\",oauth_version=\"1.0\",oauth_signature=\"ZbexXD3Npgy6pzQ3u3mnbDNFHcw%3D\"");
            try
            {

                client.execute(post);
                Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_LONG).show();

            }
            catch(IOException e)
            {
                Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
            }
        }
    });

避免在简单的HTTP请求中使用像这样的纯线程,您有很多选择,如果您正在编写一个可以执行许多HTTP调用的应用程序,我建议您从一开始就使用一些第三方网络库,不要花费任何时间自己开发它。以Android的截击为例。如果您只想进行一次性调用,请使用AsyncTask,如下所示:

public class MyTwitterCall extends AsyncTask<Void, Void, {needed data}> { 
     @Override
     protected {needed data} doInBackground(Void... params) {
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost("https://api.twitter.com/1.1/statuses/update.json");
        post.setHeader("Authorization","OAuth realm=\"https://api.twitter.com/1.1/statuses/update.json\",status=\"aay%20from%20pstman8\",oauth_consumer_key=\"xx\",oauth_token=\"xx\",oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"1420004144\",oauth_nonce=\"2neFPPabcd2neFPPabcd2neFPPabcdqq\",oauth_version=\"1.0\",oauth_signature=\"ZbexXD3Npgy6pzQ3u3mnbDNFHcw%3D\"");
       //TODO Execute call and extract response to {needed data}
    return {needed data}
}
公共类MyTwitterCall扩展了AsyncTask{
@凌驾
受保护的{所需数据}doInBackground(Void…params){
HttpClient=new DefaultHttpClient();
HttpPost=新的HttpPost(“https://api.twitter.com/1.1/statuses/update.json");
setHeader(“授权”,“OAuth领域=\”https://api.twitter.com/1.1/statuses/update.json\“,状态=\“aay%20from%20pstman8\”,oauth\u消费者密钥=“xx\”,oauth\u令牌=“xx\”,oauth\u签名方法=“HMAC-SHA1\”,oauth\u时间戳=“1420004144\”,oauth\u nonce=“2nefppabcd2neppabcd2neppabcdqq\”,oauth\u版本=“1.0\”,oauth\u签名=”ZBEXD3NPGY6PZQ3U3MNBDNFHCW%3D\”;
//TODO执行调用并提取对{所需数据}的响应
返回{所需数据}
}
然后从您的活动或片段调用:
新建MyTwitterCall().execute();

出现此错误是因为您试图显示来自辅助线程的toast消息

请从UI线程调用Toast.makeText:

activity.runOnUiThread(new Runnable() {
  public void run() {
    Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show();
  }
});

你应该在问题下发布代码片段。很可能你正在尝试在普通Java线程中使用looper,如果需要的话,你需要在其中传递looper以便可以回调。虽然不确定为什么你需要线程和异步任务,但应该适合一个或另一个查看新的更新我有发布代码有一个示例框架可以帮助你完成。嗯m、 我收到另一个错误
android.os.NetworkOnMainThreadException
你说的{required data}是什么意思??无论您试图从这个调用返回给您的客户机的是什么,我不确定它是什么,只要用您从响应中提取的对象替换它。如果您试图从任何后台线程对UI进行更改,您希望按照@Prem建议的方式对其进行包装。但是,在更改之前从后台线程向UI线程发布是不好的做法已完成。无论如何,您可以覆盖的回调很少,可以使用AsyncTask来完成。覆盖onPostExecute()可以在网络调用完成时更改您的UI。如果您想向UI发布增量更新,请覆盖onProgressUpdate(),然后从doInBackground调用publishProgress()。谢谢!!每个人都在谈论“runOnUiThread”后台线程和UI线程,但没有人展示如何实际使用它。你太棒了^