我知道這個問題已經接近幾次了。但它總是使用Apache,這已被棄用。 我想從我的應用程序發送數據到我的數據庫。我知道我的PHP代碼有效。但是當我點擊「發送」在我的應用程序,它會崩潰應用程序或它的工作,但不會發送數據到我的數據庫(或者我只是看不到它)。從Android工作室發送數據到php
這是我叫我的班 「AddDataAsyncTask」:
btnnexttrip.setOnClickListener(new View.OnClickListener(){
public void onClick (View view) {
Intent myIntent =new Intent(getBaseContext(), trip.class);
AddData =new AddDataAsyncTask();
AddData.execute();
startActivityForResult(myIntent,0);
}
});
我班AddDataAsyncTask:
private class AddDataAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
Log.i("add", "onPreExecute");
super.onPreExecute();
}
protected Void doInBackground(Void... params) {
//I Use HashMap, it works similar to NameValuePair
Map<String,String> dataToSend = new HashMap<>();
dataToSend.put("id",hisid);
dataToSend.put("name", hisname);
dataToSend.put("age", hisage);
dataToSend.put("job", hisjob);
dataToSend.put("gender", hisgender);
dataToSend.put("date_trip", hisdate);
dataToSend.put("mode_trip", hismode);
dataToSend.put("time_trip", histime);
dataToSend.put("crowded_trip", hiscrowded);
dataToSend.put("from_trip", hisfrom);
dataToSend.put("to_trip", histo);
dataToSend.put("majo_gender",hismajogender);
dataToSend.put("majo_origin",hismajoorigin);
String encodedStr = getEncodedData(dataToSend);
BufferedReader reader = null;
try {
URL url = new URL(urlAdd);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());
writer.write(encodedStr);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
Log.i("add", "onPostExecute");
super.onPostExecute(result);
if(success==1)
{
Toast.makeText(getApplicationContext(), "Good "+message, Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(getApplicationContext(), "Error " +message, Toast.LENGTH_LONG).show();
}
}
}
這似乎是 「getEncodedData」 中的 「doInBackground」 不工作:
private String getEncodedData(Map<String,String> data) {
StringBuilder sb = new StringBuilder();
for(String key : data.keySet()) {
String value = null;
try {
value = URLEncoder.encode(data.get(key),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if(sb.length()>0){
sb.append("&");
}
sb.append(key + "=" + value);
}
return sb.toString();
}
我有上網權限......這是logcat的:
05-25 10:59:00.675 2468-3214/com.example.jeremydiez.sharedlifetracks E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.example.jeremydiez.sharedlifetracks, PID: 2468
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:325)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
at java.net.URLEncoder.encode(URLEncoder.java:205)
at com.example.jeremydiez.sharedlifetracks.tripsecondpart.getEncodedData(tripsecondpart.java:198)
at com.example.jeremydiez.sharedlifetracks.tripsecondpart.access$300(tripsecondpart.java:41)
at com.example.jeremydiez.sharedlifetracks.tripsecondpart$AddDataAsyncTask.doInBackground(tripsecondpart.java:268)
at com.example.jeremydiez.sharedlifetracks.tripsecondpart$AddDataAsyncTask.doInBackground(tripsecondpart.java:240)
at android.os.AsyncTask$2.call(AsyncTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
我試圖修復它(與logcat的),所以我改變了「getEncodedData」這樣的:
private String getEncodedData(Map<String,String> data) {
StringBuilder sb = new StringBuilder();
for(Map.Entry<String, String> entry : data.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
String encodedvalue = null;
try {
encodedvalue = URLEncoder.encode(key,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if(sb.length()>0){
sb.append("&");
}
sb.append(key + "=" + encodedvalue);
}
return sb.toString();
}
有了這一個它沒有崩潰,但沒有送什麼東西給我的數據庫:/
有人可以幫我嗎?
編輯:這就是我如何定義我的urlAdd:
String urlAdd="http://192.168.15.32/enis_android_club/add_dbadd.php";
是它的好辦法做到這一點?
e.printStackTrace doesnt wo rk在Android中,所以如果你不使用功能測試更好地將其替換爲Log.e(「Tag」,Log.getStackTraseString(e));這將有助於獲得內部doInBackground – DEADMC
謝謝,我改變了它,仍然是同樣的問題:/ – Bill