0

私はidlatlongの3 つの列を持つgeopointsという 1 つの一意のテーブルを持つ MySQL データベースを持っています。 .

私の目的は、json 配列を生成する php スクリプトと httpPost などを使用して、これら 4 つのジオポイントすべてを動的にマップビューにマークすることです...

これは私がこれまでに持っているコードです:

getjson = (Button) findViewById(R.id.button1);

    getjson.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            JSONArray jArray;
            String result = null;
            InputStream is = null;
            StringBuilder sb = null;
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();//Whats this for?

            try {

                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(
                        "http://????????.com/????/getGeopoints.php");
                HttpResponse response = httpclient.execute(httpPost);
                httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpEntity entity = response.getEntity();
                is = entity.getContent();

            } catch (Exception e) {
                Log.e("log_tag", "Error connecting to http " + e.toString());
            }

            try {
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(is, "iso-8859-1"), 8);
                sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();

                result = sb.toString();
            } catch (Exception e) {
                Log.e("log_tag", "Error converting  " + e.toString());
            }

            try {

                jArray = new JSONArray(result);

                for (int i = 0; i <= jArray.length(); i++) {

                    JSONObject json_data = jArray.getJSONObject(i);

                    Log.i("log_tag", "id: " + json_data.getInt("id")
                            + ", latitude: " + json_data.getInt("lat")
                            + ", longitude: " + json_data.getInt("long"));


                }
            } catch (JSONException e) {
                Log.e("log_tag", "Error parsing data " + e.toString());
            }
        }
    });

これはphpファイルです:

 <?php
mysql_connect("?????.com", "username", "password");
mysql_select_db("database_name");

$q = mysql_query("SELECT * FROM geopoints");
while ($e = mysql_fetch_assoc($q))
    $output[] = $e;

print(json_encode($output));
mysql_close();
?>

ブラウザーに URL を入力すると、必要な正確な情報を含む正確な json 配列が生成されるため、このファイルは正しく実行されています。私が理解していないと思うだけですが、HttpEntityは何のためですか? チュートリアルをフォローアップしたため、情報をフィルタリングしたくないので、情報を含む配列を使用してデータベースからフィルタリングしました(1つまたは2つだけでなく、すべてのデータベーステーブルエントリが必要です)。空白です。

コードの何が問題になっていますか? logcat で取得するエラーは、すべてのキャッチ メッセージ「11-29 12:47:29.662: E/log_tag(898): Error connections to http Http android.os.NetworkOnMainThreadException」です。

4

2 に答える 2

2

android.os.NetworkOnMainThreadException

android >= 3.0 では、メイン UI スレッドでのネットワーク リクエストが許可されません。AsyncTaskを使用してネットワーク リクエストを呼び出す必要があります。

于 2012-11-29T17:37:39.183 に答える
1

これは、メインの UI スレッドをブロックしているためです。HTTP リクエストには AsyncTasks を使用してみてください。

于 2012-11-29T17:37:36.803 に答える