【问题标题】:HttpUrlConnect not sending data to PhPHttpUrlConnection 不向 PhP 发送数据
【发布时间】:2015-10-28 14:26:19
【问题描述】:

我是 Android 编程的初学者,并尝试通过开发应用来学习。 我想做的是将数据发送到网络服务器,该服务器将相应地进一步处理它。现在我之前使用了 HttpClient 功能,但似乎已被弃用。一些研究把我带到了这个 HttpUrlConnect 类,它没有抛出任何错误,但也没有真正起作用! PhP 没有接收到数据。请帮忙!代码如下:

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
   SendData sendData = new SendData();
    Toast t4 = Toast.makeText(getApplicationContext(), "Started", Toast.LENGTH_LONG);
    t4.show();
    sendData.execute("21.43","23.23");
}
class SendData extends AsyncTask<String, Void, String>{
    @Override
    protected String doInBackground(String... params) {
        // a-> Lat | b-> Lon
    try {
        String a_str = params[0];
        String b_str = params[1];
        String result = null;
        URL url = null;
        String text = "";
        BufferedReader reader = null;
        try {
            String data = URLEncoder.encode("lon", "UTF-8") + "=" + URLEncoder.encode(a_str, "UTF-8");
            data += "&" + URLEncoder.encode("lat", "UTF-8") + "=" + URLEncoder.encode(b_str, "UTF-8");
            url = new URL("http://chalkbox.in/recieve.php");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("Host", "chalkbox.in");
            try {
                OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
                wr.write(data);
                wr.flush();
                Toast t0 = Toast.makeText(getApplicationContext(), "Pushed", Toast.LENGTH_LONG);
                t0.show();
            } catch (Exception e) {
                Toast t1 = Toast.makeText(getApplicationContext(), String.valueOf(e), Toast.LENGTH_LONG);
                t1.show();
            }
            conn.connect();
        } catch (Exception e) {
                Toast t5 = Toast.makeText(getApplicationContext(), String.valueOf(e), Toast.LENGTH_LONG);
            t5.show();
        }
    }
    catch (Exception e){
        Toast t11 = Toast.makeText(getApplicationContext(), String.valueOf(e), Toast.LENGTH_LONG);
        t11.show();
    }
        return null;
    }
}
}

现在,它只是祝酒“开始”,然后什么都没有。我已经检查了互联网连接、互联网访问权限和所有内容。它不会推送数据,也不会出现任何错误。最终它停止工作。

PhP 代码是:

<?php
$long = $_POST['lon'];
$lati = $_POST['lat'];

$con = mysqli_connect($host",$user,$pass,$dB);
$sql = "INSERT INTO table (long, lati) VALUES('$long', '$lati')";
if(mysqli_query($con, $sql)){
    mysqli_close($con);
}
?>

LogCat:

10-29 06:27:10.528 1919-1919/com.employeetracker.theworkstation.attempt2 I/art:没有后期启用 -Xcheck:jni(已经启用)

10-29 06:27:10.849 1919-1941/com.employeetracker.theworkstation.attempt2 D/OpenGLRenderer: 使用 EGL_SWAP_BEHAVIOR_PRESERVED: true

10-29 06:27:10.852 1919-1919/com.employeetracker.theworkstation.attempt2 D/: HostConnection::get() New Host Connection created 0xb3eb3ef0, tid 1919

10-29 06:27:10.876 1919-1927/com.employeetracker.theworkstation.attempt2 W/art:暂停所有线程耗时:12.031ms

10-29 06:27:10.890 1919-1919/com.employeetracker.theworkstation.attempt2 D/Atlas: 验证地图...

10-29 06:27:10.919 1919-1941/com.employeetracker.theworkstation.attempt2 D/:HostConnection::get() 新主机连接已建立 0xb3ffd110,tid 1941

10-29 06:27:10.959 1919-1941/com.employeetracker.theworkstation.attempt2 I/OpenGLRenderer﹕初始化的 EGL,版本 1.4

10-29 06:27:11.009 1919-1941/com.employeetracker.theworkstation.attempt2 D/OpenGLRenderer: 启用调试模式 0

10-29 06:27:11.036 1919-1941/com.employeetracker.theworkstation.attempt2 W/EGL_emulation:eglSurfaceAttrib 未实现

10-29 06:27:11.036 1919-1941/com.employeetracker.theworkstation.attempt2 W/OpenGLRenderer:无法在表面 0xb3f1d580 上设置 EGL_SWAP_BEHAVIOR,错误=EGL_SUCCESS

10-29 06:27:11.409 1919-1922/com.employeetracker.theworkstation.attempt2 W/art:暂停所有线程耗时:250.499ms

10-29 06:27:11.473 1919-1941/com.employeetracker.theworkstation.attempt2 W/EGL_emulation:eglSurfaceAttrib 未实现

10-29 06:27:11.474 1919-1941/com.employeetracker.theworkstation.attempt2 W/OpenGLRenderer:无法在表面 0xb3eabf80 上设置 EGL_SWAP_BEHAVIOR,错误=EGL_SUCCESS

10-29 06:27:11.566 1919-1927/com.employeetracker.theworkstation.attempt2 I/art:后台部分并发标记扫描 GC freed 2566(119KB) AllocSpace objects, 0(0B) LOS objects, 50% free , 1000KB/2024KB, 暂停 4.554ms 共 147.763ms

10-29 06:27:11.588 1919-1927/com.employeetracker.theworkstation.attempt2 W/art:暂停所有线程耗时:11.688ms

10-29 06:27:11.669 1919-1919/com.employeetracker.theworkstation.attempt2 I/Choreographer: 跳过了 31 帧!应用程序可能在其主线程上做了太多工作。

更新:

10-30 01:39:39.374 10716-10731/com.employeetracker.theworkstation.attempt2 E/AndroidRuntime:致命异常:AsyncTask #1 进程:com.employeetracker.theworkstation.attempt2,PID:10716 java.lang.RuntimeException:执行doInBackground()时出错

在 android.os.AsyncTask$3.done(AsyncTask.java:304)

        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)

        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)

        at java.util.concurrent.FutureTask.run(FutureTask.java:242)

        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)

        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)

        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)

        at java.lang.Thread.run(Thread.java:818)
 Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

        at android.os.Handler.<init>(Handler.java:200)

        at android.os.Handler.<init>(Handler.java:114)

        at android.widget.Toast$TN.<init>(Toast.java:344)

        at android.widget.Toast.<init>(Toast.java:100)

        at android.widget.Toast.makeText(Toast.java:258)

        at com.employeetracker.theworkstation.attempt2.MainActivity.show(MainActivity.java:39)

        at com.employeetracker.theworkstation.attempt2.MainActivity$SendData.doInBackground(MainActivity.java:80)

        at com.employeetracker.theworkstation.attempt2.MainActivity$SendData.doInBackground(MainActivity.java:42)

        at android.os.AsyncTask$2.call(AsyncTask.java:292)

         at java.util.concurrent.FutureTask.run(FutureTask.java:237)

            在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)

            在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)

            在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)

            在 java.lang.Thread.run(Thread.java:818) 10-30 01:39:43.082 10716-10731/com.employeetracker.theworkstation.attempt2 I/Process:发送信号。 PID:10716 SIG:9

【问题讨论】:

  • 我的2分无用:在你的URL(在你的代码中),你访问的路径是“recieve.php”,你确定不是“receive.php”吗?
  • 在检查 Android 问题时最好发布 AndroidManifest.xml 以及关联的 Logcat....您也可以从服务器发布 access.log 和 error.log(我是猜测 apache、mysql、php) 以确保您有正确的传输,并且没有服务器内部错误。最后,如果您的程序使用互联网传输,但那不是应用程序核心的一部分,我强烈建议您查看Volley

标签: php android


【解决方案1】:

我已经完全改变了我的答案,因为这里的问题现在很清楚了。 正如我在下面的 cmets 中提到的,您无法在主线程上运行与服务器的连接(意味着您的活动或片段当前正在运行)。 需要做的是在异步类中运行它。如下创建一个类:

class SendData extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
     try{
            //Your code 
            }
    return null;
}
}

然后你可以通过在你的活动/片段中创建一个实例来调用这个类,并执行它。

您可以在this blog post 上找到有关如何正确操作的详细信息

【讨论】:

  • 抱歉!那是一个错字。不,我没有。我会做的,一定会让你知道。除此之外代码还有什么问题吗!?
  • 你能在你的收获中烤出“推”以外的东西吗?这样我们就可以知道android中是否发生了错误?
  • 哦,是的,这是一个主要的逻辑错误,你需要在除主线程之外的任何东西上运行连接。我将在大约 20 分钟内发布代码,为您修复它
  • 非常感谢!你太棒了:D。由于我是一名学习者,我真的很想知道是什么导致了这个问题,你是如何修复它的,以及修复的作用是什么?
  • 更新了我的答案,如果您需要更多帮助,请告诉我!
【解决方案2】:

日志猫在创建 Toast 时显示错误。
据我所知,您不能在主线程上进行 UI 操作。
为了在异步任务中显示 Toast,您必须调用 runOnUi 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多