【问题标题】:Android: passing parameters through urlAndroid:通过url传递参数
【发布时间】:2012-12-17 17:11:01
【问题描述】:

我想使用 http post 请求将一些数据插入数据库。 我的 post.php 页面是:

      if(trim($_GET['param1'])!="" && trim($_GET['param2'])!="" && trim($_GET['param3'])!="" && trim($_GET['param4'])!="" && trim($_GET['param5'])!="")
{
    $connectionInfo = array(  "UID" => $DB_USER,  "PWD" => $DB_PASS, "Database"=>$DB_DATABASE );
    $con = sqlsrv_connect($DB_SERVER,$connectionInfo);
    if(!$con)
    {
      die('Could not connect: ' . sqlsrv_errors());
    }
    $query="INSERT INTO Table (param1,param2,param3,param4,param5) VALUES (
            '".$_GET['param1']."',
            ".$_GET['param2'].",
            ".$_GET['param3'].",
            '".$_GET['param4']."',
            ".$_GET['param5'].")";
            [...]

为了发送数据,我将所有参数附加到 url,例如:http://<myip>/MySite/post.php?param2=10&param3=8&param1=2012-12-01 13:00:00&param4=Name&param5=80

一切正常,但是当我尝试从我的 Android 应用程序发送数据时,我无法达到我的目标。 如何通过 url 传递数据? 在 Android 中我尝试过:

    HttpPost httppost = new HttpPost("http://<Myip>/MySite/post.php");
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(5);
    nameValuePairs.add(new BasicNameValuePair("param2", "10"));
    nameValuePairs.add(new BasicNameValuePair("param3", "98"));
    nameValuePairs.add(new BasicNameValuePair("param1", "2012-12-01 13:00:00"));
    nameValuePairs.add(new BasicNameValuePair("param4", "Name"));
    nameValuePairs.add(new BasicNameValuePair("param5", "50"));
    //httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
    httppost.setHeader("Content-Type", "application/x-www-form-urlencoded");
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));  

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

并与:

String urlParameters = "param1=2012-12-01 13:00:00&param2=b&param3=c...";
String request = "http://<Myip>/MySite/post.php";
URL url = new URL(request); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection();           
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setInstanceFollowRedirects(false); 
connection.setRequestMethod("POST"); 
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", ""  Integer.toString(urlParameters.getBytes().length));
connection.setUseCaches (false);
DataOutputStream wr = new DataOutputStream(connection.getOutputStream ());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
connection.disconnect();

但我总是出错。 使用第二种方法的例外是:

12-17 18:08:26.617: E/AndroidRuntime(4837): FATAL EXCEPTION: main
12-17 18:08:26.617: E/AndroidRuntime(4837): android.os.NetworkOnMainThreadException
12-17 18:08:26.617: E/AndroidRuntime(4837):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.io.IoBridge.connect(IoBridge.java:112)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at java.net.Socket.connect(Socket.java:842)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:77)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at  com.example.applic.applic.postData(MyApp.java:197)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at com.example.applic.applic$1.run(MyApp.java:127)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at android.os.Handler.handleCallback(Handler.java:605)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at android.os.Looper.loop(Looper.java:137)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at android.app.ActivityThread.main(ActivityThread.java:4514)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at java.lang.reflect.Method.invokeNative(Native Method)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at java.lang.reflect.Method.invoke(Method.java:511)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
12-17 18:08:26.617: E/AndroidRuntime(4837):     at dalvik.system.NativeStart.main(Native Method)

我能做什么?

【问题讨论】:

  • 不要在 UI 线程上运行网络操作。看看这里:stackoverflow.com/questions/6343166/…
  • 我在处理程序中运行我的网络操作,它不在主线程中。
  • 除非你已经在另一个线程中启动了处理程序,它仍然会在主线程上运行
  • nandeesh 是对的。再次注意您的错误名称:NetworkOnMainThreadException
  • 在主线程上搜索networking,首先是(-1 表示不搜索这个词,实际上有数千篇关于该主题的文章)。然后,您正在使用 post 获取。您在 PHP 中使用 _GET,这表明您想要接收 GET 请求。但是您使用的是 HttpPost,然后是 Post 请求,这表明并非如此。

标签: php android sql-server http-post


【解决方案1】:

NetworkOnMainThreadException

当应用程序尝试执行 在其主线程上进行网络操作。

表示您正在尝试从 UI 线程运行网络操作,因此将所有与网络相关的代码放在 AsyncTaskdoInBackground 方法中,并在 doInBackground 方法执行完成时使用 onPostExecute 更新 UI

如果您使用的是 API LEVEL 9 或 GREATER FROM 9,则在 Activity 的 onCreate 中添加 StrictMode 以避免此错误

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectDiskReads()
                 .detectDiskWrites()
                 .detectNetwork()  
                 .penaltyLog()
                 .build());

【讨论】:

    【解决方案2】:

    您将收到 NetworkOnMainThreadException 异常。您需要将网络请求代码移动到另一个线程或使用 Asynctask。

    你不能在主线程上发出网络请求

    【讨论】:

    • 好的,但是我在处理程序中运行我的 postData() 方法。
    • Handler 只是异步运行代码的助手,它仍然会在主线程上运行代码。您必须在准备好looper的不同线程中创建处理程序,然后它才能工作
    • 如果我们使用API LEVEL 9 or GREATER FROM 9,那么我们将通过使用StrictMode而不使用Asynctask从Ui线程创建网络,但最好使用Asynctask以使您的代码更可重用跨度>
    【解决方案3】:

    当应用程序尝试在其主线程上执行网络操作时抛出此异常,而这在 android 版本 >= 3 中是不允许的。

    要摆脱这个异常,更好的方法是在 AsyncTask 中运行您的代码:

    class BackTask extends AsyncTask<Void, Void, Void> {
        protected Void doInBackground(Void... arg) {
            //Implement Logic you want to perform in background.
        }
    
        protected void onPostExecute(Void feed) {
           //Implement logic whatever you want to perform after task complete.
        }
     }
    
    new BackTask().execute();
    

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

    【讨论】:

      猜你喜欢
      • 2014-05-22
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2017-10-12
      • 2012-03-12
      • 2018-09-06
      相关资源
      最近更新 更多