【问题标题】:My Async HTTP-Post does not work for an unkown reason我的异步 HTTP-Post 因未知原因无法工作
【发布时间】:2013-11-11 10:02:35
【问题描述】:

我是 android 新手,我尝试了一个简单的 HTTP Post,我有一个工作但成为您无法在主类中发布的错误消息。经过一些 Google 研究后,我找到了一个替代方案 - 异步任务 - 但我无法完全理解为什么这个简单的示例不起作用。

谁能帮帮我?

提前谢谢你。

      new MyAsyncTask().execute().toString();
        }

    class MyAsyncTask extends AsyncTask<String, Integer, Double> {
        // private ProgressBar pb;
         //pb=(ProgressBar);
         //pb.setVisibility(View.GONE);

        @Override
        protected Double doInBackground(String... params) {

            postData(params[0]);
            return null;
        }

        protected void onPostExecute(Double result){
          //  pb.setVisibility(View.GONE);
            Toast.makeText(getApplicationContext(), "command sent",   
Toast.LENGTH_LONG).show();
        }

      //  protected void onProgressUpdate(Integer... progress){
        //    pb.setProgress(progress[0]);
        //}

        public void postData(String valueIWantToSend) {
// Create a new HttpClient and Post Header
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("url(got a real one here)");

try {

// Add your data
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("myHttpData", valueIWantToSend));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

// Execute HTTP Post Request
    HttpResponse response = httpclient.execute(httppost);

    } catch (ClientProtocolException e) {
   // Log.i("CATCH Read from server", "error");
    } catch (IOException e) {
   // Log.i("CATCH Read from server", "error");
     }
    }
   }

11-11 15:08:32.768 357-394/? E/lights:write_int 无法打开 /sys/class >/sec/sec_touchkey/brightness

11-11 15:10:45.503 110-259/? E/SurfaceFlinger﹕SurfaceFlinger translucent=1 >isOpaque=0 isExternalDisplayLayer=0 isExternalBlockLayer0

11-11 15:04:57.643 28774-28790/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 java.lang.RuntimeException:执行 doInBackground() 时发生错误 在 android.os.AsyncTask$3.done(AsyncTask.java:299) 在 java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 在 java.util.concurrent.FutureTask.setException(FutureTask.java:124) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 在 java.util.concurrent.FutureTask.run(FutureTask.java:137) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 在 >java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 在 >java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 在 java.lang.Thread.run(Thread.java:856) 原因:java.lang.IllegalStateException:目标主机不能为空,或在>参数中设置。方案=null,主机=null,路径=vlothopc.dyndns-home.com/mobile.asp 在 >org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.j>ava:591) 在 >org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:293>) 在 >org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 在 >org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 在 >org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 在 >com.example.miniapp2.MainActivity$1$MyAsyncTask.postData(MainActivity.java:310) 在 >com.example.miniapp2.MainActivity$1$MyAsyncTask.doInBackground(MainActivity.java:284) 在 >com.example.miniapp2.MainActivity$1$MyAsyncTask.doInBackground(MainActivity.java:276) 在 android.os.AsyncTask$2.call(AsyncTask.java:287) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 在 java.util.concurrent.FutureTask.run(FutureTask.java:137) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 在 >java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 在 >java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 在 java.lang.Thread.run(Thread.java:856)

【问题讨论】:

  • 任何日志记录?另外,你确定你没有抛出异常吗?
  • 你是否在你的 mainfest 中拥有互联网权限
  • 没有例外,我的应用程序简单地停止运行。是的,我的 Android 清单中有 Internet 权限。我要添加 Logcat 跟踪。
  • 传递给 AsyncTask.execute() 的参数是什么?没有?

标签: java android android-asynctask http-post android-studio


【解决方案1】:

请参考http://developer.android.com/reference/android/os/AsyncTask.html

new MyAsyncTask().execute().toString();
//changed to
new MyAsyncTask().execute("value 1");

请始终检查varargs String... params 的长度。

【讨论】:

  • 改了,还是不行,logcat没区别
  • HttpPost httppost = new HttpPost("url(got a real one here)"); url是假的?
  • 它是一个网站的真实网址,它应该能够接收数据并将其显示给我。
【解决方案2】:

您的日志中有以下异常消息:

Target host must not be null, or set in >parameters. scheme=null, host=null

这可能来自您在初始化 HttpPost 对象时放置的主机值。你忘了指定我认为的协议。

您的网址的确切值是多少?如果尚未设置,请尝试使用“http://”。

您还应该指定内容类型、长度等。只是不确定这是否是协议所必需的。

【讨论】:

  • 出于不同的原因,我决定使用异步任务,例如它应该比简单的 http-post 更安全。问题是为什么这个示例不起作用?
  • 我在设备上调试添加了logcat,它与虚拟设备不同 - 可以帮助你吗?
  • 我正在使用一个网站的url,所以我可以检查我是否成功发送数据。如果在不同情况下会有所不同,我如何指定内容类型和长度?
  • 如何添加协议?和其他参数有什么例子吗?
  • 您必须以字符串形式提供 URL,包括协议。例如:“myweburl.com”。并且要为您的请求指定其他标头属性,只需检查对象 HttpPost 的属性,您应该有类似 'setHeader('propName', value)' 的方法
猜你喜欢
  • 2012-12-04
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多