问题
I'm trying to get the basics of an Android app that sends and receives data from a MySQL server (my implementation will have nothing to do with this learning example). Here's the code so far:
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();
}
}
}
And here's the code for the XML file '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>
And here are the LogCat problems I'm encountering:
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 obviously the network connection on main thread problem means I need to move this into an Asynctask, right? But with such a bevy of errors, I wonder if I am missing something else, that's obvious? I eventually want to be able to register user/passwords onto a database, then get queries and send responses, so this is just a warm up basically. If you goto http://www.davidjkelley.net/city.php you can see that the database is indeed properly responding to the query PHP file that I have linked inside the Android code, so that's not the problem.
Edit~ I should note that my Activity previously extended list Activity, following this tutorial: http://blog.sptechnolab.com/2011/02/10/android/android-connecting-to-mysql-using-php/ which is why my XML is just a ListView at the moment, because that helped clear up an error that said I needed a ListView component with the id 'list'.
Edit~ My 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();
?>
Obviously the sets of stars are the correct information, as when you visited the link posted above, the SQL readout appears properly.
回答1:
How are your running your database? Posting how the PHP connects may be more relevant. It's very possible that in the PHP you aren't connecting the request from the app to the actual database (either with an incorrect url or the name of the database itself). Check out this tutorial. I can confirm it works fine and it seems to accomplish the functionality you need as well. In that tutorial there are notes on where to change the code so that you can run it on your hosted server instead of localhost.
来源:https://stackoverflow.com/questions/9879448/android-failing-to-connect-to-mysql-database-properly