-1

我是 android 新手,我想创建一个从 mysql 服务器读取数据的应用程序。我从网上拿了一个关于这个的例子,但我不能让它工作

我为此使用 eclipse,而另一部分使用 php 和 mysql。首先,这是我运行正常的 php 脚本(city.php):

<?php
//connecting to database
$sql=mysql_query("select * from city");
$output = array();
while(list($id,$name)=mysql_fetch_array($sql)){
    $output[$id]=$name;

}
print(json_encode($output));
mysql_free_result($sql);

?>

这是返回:

{"1":"Brasov","2":"Bucuresti"}

在我来自 Eclipse 的 android 项目中,我在 MainActivity.java 中有:

package com.example.mycity;


import android.os.Bundle;
import android.app.Activity;


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.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.net.ParseException;
import android.util.Log;
import android.widget.Toast;

public class MainActivity extends Activity {

JSONArray jArray;
String result = null;
InputStream is = null;
StringBuilder sb=null;

@Override
public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
//http post
try{
     HttpClient httpclient = new DefaultHttpClient();
     HttpPost httppost = new HttpPost("http://www.steagu.ro/android/city.php");
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
     HttpResponse response = httpclient.execute(httppost);
     if (response.getStatusLine().getStatusCode() != 200) {
            Log.d("MyApp", "Server encountered an error.");

     }
     HttpEntity entity = response.getEntity();
     is = entity.getContent();
     }catch(Exception e){
         //e.printStackTrace();
         Log.e("log_tag", "Error in http connection: "+e.toString());
    }

  }


}

但是当我运行它时,我在 logcat 上收到一个错误:它没有连接到文件:http 连接中的错误:android.os.NetworkOnMainThreadException

10-24 13:04:34.429: I/dalvikvm(982): threadid=3: reacting to signal 3
10-24 13:04:34.649: I/dalvikvm(982): Wrote stack traces to '/data/anr/traces.txt'
10-24 13:04:34.859: E/log_tag(982): Error in http connection: android.os.NetworkOnMainThreadException
10-24 13:04:34.919: I/dalvikvm(982): threadid=3: reacting to signal 3
10-24 13:04:34.949: I/dalvikvm(982): Wrote stack traces to '/data/anr/traces.txt'
10-24 13:04:35.151: D/gralloc_goldfish(982): Emulator without GPU emulation detected.
10-24 13:04:35.479: I/dalvikvm(982): threadid=3: reacting to signal 3
10-24 13:04:35.499: I/dalvikvm(982): Wrote stack traces to '/data/anr/traces.txt'

我在 AndroidManifest.xml 中拥有 Internet 权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mycity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我不知道问题出在哪里。有人可以帮我吗?谢谢!

4

3 回答 3

0

问题是这样的:

10-24 13:04:34.859: E/log_tag(982): Error in http connection: 
                    android.os.NetworkOnMainThreadException 

您需要在不同的线程上进行网络访问。

于 2012-10-24T13:20:12.063 回答
0

您可以使用 AsyncTask 类来执行您的网络操作,因为 strictmode 不允许它在主 UI 示例上完成,如下所示

          public class MainActivity extends Activity {

         JSONArray jArray;
         String result = null;
         InputStream is = null;
          StringBuilder sb=null;

         @Override
        public void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       new httpRequest().execute();

        }


         private class httprRequest extends AsyncTask<String, Integer, String>{

                @override
                public String doInBackground(String.... params){
                   ArrayList<NameValuePair> nameValuePairs = new             ArrayList<NameValuePair>();
        //http post
          try{
           HttpClient httpclient = new DefaultHttpClient();
           HttpPost httppost = new HttpPost("http://www.steagu.ro/android/city.php");
           httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
           HttpResponse response = httpclient.execute(httppost);
           if (response.getStatusLine().getStatusCode() != 200) {
               Log.d("MyApp", "Server encountered an error.");

              }
          HttpEntity entity = response.getEntity();
          is = entity.getContent();
          }catch(Exception e){
          //e.printStackTrace();
          Log.e("log_tag", "Error in http connection: "+e.toString());
           }

                }
              }

           }
       }
于 2012-10-24T13:59:46.730 回答
-1

谢谢kabuto178,我进行了更改并且正在连接。我还编写了用于从 mysql 检索数据的代码,所以谁需要这个,可以使用我的示例

这是代码:

package com.example.mycity;


import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;


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.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.net.ParseException;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

String result = "";
InputStream is = null;
StringBuilder sb=null;
//String ct_name = null;

@Override
public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new httprRequest().execute();


int ct_id=0;
String ct_name="";

//Toast.makeText(getBaseContext(), "This is "+result, 3000).show();

try {
Thread.sleep(1000L);
} catch (Exception te) {}

try{
    //ct_name = result;
    JSONArray jArray = new JSONArray(result);

    for(int i=0;i<jArray.length();i++){
           JSONObject json_data= jArray.getJSONObject(i);
           ct_id=json_data.getInt("CITY_ID");
           ct_name += json_data.getString("CITY_NAME")+":";
       }

    }
    catch(JSONException e1){
      e1.printStackTrace();
    } catch (ParseException e1) {
            e1.printStackTrace();
    }

TextView tv1 = (TextView) findViewById(R.id.textView1);
tv1.setText(ct_name);

}

private class httprRequest extends AsyncTask<String, Integer, String>{

    @Override 
    public String doInBackground(String... params){
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
//http post
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.steagu.ro/android/city.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
if (response.getStatusLine().getStatusCode() != 200) {
   Log.d("MyApp", "Server encountered an error.");

  }
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
//e.printStackTrace();
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){
        //Toast.makeText(getBaseContext(), "Am eroare aici", 3000).show();
        Log.e("log_tag", "Error converting result "+e.toString());
}


/*
Toast.makeText(getBaseContext(), "Here i am", 3000).show();
*/

return result;
    }

  }

}

我必须更改一点代码,因为我放了一个thread.sleep。而不是它,我必须检查我是否有一个值到结果中(在一个while循环中)。我认为这种情况正在发生,因为在我尝试解析值的那一刻,我没有结果值。

php代码是:

<?php
//connecting to database
$sql=mysql_query("select * from city where CITY_NAME like '%'");
$output = array();
while($row=mysql_fetch_assoc($sql)){
    $output[]=$row;
}

echo json_encode($output);
mysql_free_result($sql);

?>

表“city”有两列,CITY_ID 和 CITY_NAME。

于 2012-10-25T07:37:55.500 回答