【发布时间】: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