Ich versuche, die Grundlagen einer Android-App zu erhalten, die Daten von einem MySQL-Server sendet und empfängt (meine Implementierung wird mit diesem Lernbeispiel nichts zu tun haben). Hier ist der Code so weit:Android kann keine Verbindung zur MySQL-Datenbank herstellen
package com.davekelley.polling;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ActionBar;
import android.app.Activity;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
public class Chart extends Activity {
JSONArray jArray;
String result = null;
InputStream is = null;
StringBuilder sb=null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chartfragment);
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
//http post
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.davidjkelley.net/city.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
Log.e("log_tag", "Error in http connection "+e.toString());
}
//convert response to string
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
String line="0";
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result=sb.toString();
}catch(Exception e){
Log.e("log_tag", "Error converting result "+e.toString());
}
//paring data
int ct_id;
String ct_name;
try{
jArray = new JSONArray(result);
JSONObject json_data=null;
for(int i=0;i<jArray.length();i++){
json_data = jArray.getJSONObject(i);
ct_id=json_data.getInt("CITY_ID");
ct_name=json_data.getString("CITY_NAME");
}
}
catch(JSONException e1){
Toast.makeText(getBaseContext(), "No City Found" ,Toast.LENGTH_LONG).show();
} catch (ParseException e1) {
e1.printStackTrace();
}
}
}
Und hier ist der Code für die XML-Datei 'chartfragment':
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<!-- <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/chartTitleTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge" android:gravity="center"/>
-->
</ListView>
Und hier sind die LogCat Probleme Ich zu begegnen:
03-26 20:34:13.782: E/log_tag(1025): Error in http connection android.os.NetworkOnMainThreadException
03-26 20:34:13.802: E/log_tag(1025): Error converting result java.lang.NullPointerException
03-26 20:34:13.802: D/AndroidRuntime(1025): Shutting down VM
03-26 20:34:13.802: W/dalvikvm(1025): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
03-26 20:34:13.832: E/AndroidRuntime(1025): FATAL EXCEPTION: main
03-26 20:34:13.832: E/AndroidRuntime(1025): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.davekelley.polling/com.davekelley.polling.Chart}: java.lang.NullPointerException
03-26 20:34:13.832: E/AndroidRuntime(1025): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
03-26 20:34:13.832: E/AndroidRuntime(1025): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
03-26 20:34:13.832: E/AndroidRuntime(1025): at android.app.ActivityThread.access$600(ActivityThread.java:123)
03-26 20:34:13.832: E/AndroidRuntime(1025): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
03-26 20:34:13.832: E/AndroidRuntime(1025): at android.os.Handler.dispatchMessage(Handler.java:99)
03-26 20:34:13.832: E/AndroidRuntime(1025): at android.os.Looper.loop(Looper.java:137)
03-26 20:34:13.832: E/AndroidRuntime(1025): at android.app.ActivityThread.main(ActivityThread.java:4424)
03-26 20:34:13.832: E/AndroidRuntime(1025): at java.lang.reflect.Method.invokeNative(Native Method)
03-26 20:34:13.832: E/AndroidRuntime(1025): at java.lang.reflect.Method.invoke(Method.java:511)
03-26 20:34:13.832: E/AndroidRuntime(1025): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-26 20:34:13.832: E/AndroidRuntime(1025): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-26 20:34:13.832: E/AndroidRuntime(1025): at dalvik.system.NativeStart.main(Native Method)
03-26 20:34:13.832: E/AndroidRuntime(1025): Caused by: java.lang.NullPointerException
03-26 20:34:13.832: E/AndroidRuntime(1025): at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
03-26 20:34:13.832: E/AndroidRuntime(1025): at org.json.JSONTokener.nextValue(JSONTokener.java:94)
03-26 20:34:13.832: E/AndroidRuntime(1025): at org.json.JSONArray.<init>(JSONArray.java:87)
03-26 20:34:13.832: E/AndroidRuntime(1025): at org.json.JSONArray.<init>(JSONArray.java:103)
03-26 20:34:13.832: E/AndroidRuntime(1025): at com.davekelley.polling.Chart.onCreate(Chart.java:68)
03-26 20:34:13.832: E/AndroidRuntime(1025): at android.app.Activity.performCreate(Activity.java:4465)
03-26 20:34:13.832: E/AndroidRuntime(1025): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-26 20:34:13.832: E/AndroidRuntime(1025): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
03-26 20:34:13.832: E/AndroidRuntime(1025): ... 11 more
So offensichtlich die Netzwerkverbindung auf Hauptproblem Thread bedeutet, dass ich dies in eine Asynctask verschieben muss, oder? Aber mit solch einer Flut von Fehlern frage ich mich, ob ich etwas anderes vermisse, das ist offensichtlich? Ich möchte schließlich in der Lage sein, Benutzer/Passwörter auf einer Datenbank zu registrieren, dann Abfragen zu erhalten und Antworten zu senden, also ist dies im Grunde nur ein Warm-Up. Wenn Sie zu http://www.davidjkelley.net/city.php gehen, können Sie sehen, dass die Datenbank in der Tat richtig auf die Abfrage PHP-Datei reagiert, die ich innerhalb des Android-Codes verknüpft habe, so dass das nicht das Problem ist.
Bearbeiten ~ Ich sollte beachten, dass meine Aktivität zuvor Liste Aktivität, nach diesem Tutorial: http://blog.sptechnolab.com/2011/02/10/android/android-connecting-to-mysql-using-php/ aus diesem Grund meine XML ist nur ein ListView im Moment, weil das half, einen Fehler, der sagte, dass ich eine ListView-Komponente benötigt mit die ID 'Liste'.
bearbeiten ~ Mein PHP-Code:
<?php
mysql_connect("127.0.0.1","***","***");
mysql_select_db("***");
$sql=mysql_query("select * from CITY where CITY_NAME like 'A%'");
while($row=mysql_fetch_assoc($sql))
$output[]=$row;
print(json_encode($output));
mysql_close();
?>
Offensichtlich sind die Sätze von Sternen sind die richtigen Informationen, wie wenn Sie auf den Link oben gepostet besucht, die SQL-Auslesung richtig erscheint.
Wenn Sie NetworkOnMainThreadException bekommen, ist das so grundlegend wie es geht. Fix das zuerst. Die Tatsache, dass Sie eine .php-Seite mit mysql DB treffen, ist ein Nebenproblem an dieser Stelle. Sie haben wahrscheinlich nicht einmal ein SYN-Paket gesendet ... –
Würdest du es gerne erklären? Ich fragte nach, wie man dafür auch eine Asynctask erstellen kann ... – Davek804
Für asynchrone sieht das wie ein Ort aus: http://www.vogella.de/articles/AndroidPerformance/article.html insbesondere siehe Abschnitt 5. –