0

jsonをデータベースからリストビューにパーサーするアプリを構築しています。PHPスクリプトを使用して、データベースのデータを以下のJSON形式でエンコードしました。

[
 {"id":"1","artistname":"Rihanna"},
 {"id":"2","artistname":"Katy Perry"},
 {"id":"3","artistname":"DJ Dibs"},
 {"id":"4","artistname":"Jamie Foxx"},
 {"id":"5","artistname":"Disclosure"}

]

上記のデータを文字列として返すパーサークラスは次のとおりです。

    package com.example.jsontester;

     public class JsonParser {
     static InputStream is = null;
     static JSONObject jsonObject = null;
     static String data = "";


     public JsonParser() {

     }

     public String getJSONFromUrl(String url) {

     // Making HTTP request
     try {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();            

     } 
     catch (UnsupportedEncodingException exception) {
        exception.printStackTrace();
     } catch (ClientProtocolException exception) {
        exception.printStackTrace();
     } catch (IOException exception) {
        exception.printStackTrace();
     }

     //Gets the JSON String
     try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);

        StringBuilder sBuilder = new StringBuilder();
        String line = null;

        //Appends the string to the line
        while ((line = reader.readLine()) != null) {
            sBuilder.append(line + "\n");
        }

        is.close();
        data = sBuilder.toString();

      } 

      catch (Exception exception) {
        exception.printStackTrace();
      }


     return data;

    }
   }

これがチャートアイテムでリストビューを作成するアクティビティです

package com.example.jsontester;

 public class JsonActivity extends ListActivity{

 private ProgressDialog progressDialog;

    // JSON Node names
    private static final String TAG_ITEM = "item";
    private static final String TAG_ID = "id";
    private static final String TAG_ARTISTNAME = "artistname";

 // chartItemList is the array list that holds the chart items 
    ArrayList<HashMap<String, Integer>> chartItemList = 
         new ArrayList<HashMap<String, Integer>>();
    JsonParser Parser = new JsonParser();
 // JSONArray
    JSONArray chartItems = null;

/** Called when the activity is first created. */    
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.progressdialog);

    //url from where the JSON has to be retrieved
    String url = <<http://127.0.0.1/mmcv/>>;

    //Check if the user has a connection

    ConnectivityManager cm = 
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = cm.getActiveNetworkInfo();
    if (info != null) {
        if (!info.isConnected()) {
            Toast.makeText(this, 
           "Please check your connection and try again.", Toast.LENGTH_SHORT).show();
        }

        //if positive, fetch the articles in background
        else new getChartItems().execute(url);
    }

    //else show toast
    else {
        Toast.makeText(this, "Please check your connection and try again.", 
             Toast.LENGTH_SHORT).show();
    }

}

class getChartItems extends AsyncTask<String, String, String> {

    // Shows a progress dialog while executing background task
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = new ProgressDialog(JsonActivity.this);
        progressDialog.setMessage("Loading chart...");
        progressDialog.setIndeterminate(false);
        progressDialog.setCancelable(false);
        progressDialog.show();
    }

    //Gets the json data for chart items data and presents it in a list view
    @Override
    protected String doInBackground(String... args) {
        String url = <<http://127.0.0.1/mmcv>>;
        String json = Parser.getJSONFromUrl(url);
        System.out.println("Json should be below me");
        System.out.println(json);
        int id;

        String artistname;

        try{

        chartItems = new JSONArray(json);

        JSONObject json_data=null;

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

            json_data = chartItems.getJSONObject(i);

            artistname=json_data.getString("TAG_ARTISTNAME");
            id=json_data.getInt("TAG_ID");


             HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
             // adding each child node to HashMap key => value
                hashMap.put(artistname,id);

             // adding HashMap to ArrayList
                chartItemList.add(hashMap);

         }
        }

        catch (JSONException e) {
            e.printStackTrace();
        }

        runOnUiThread(new Runnable() {
            public void run() {

             //updating list view with the parsed items
                ListAdapter adapter = new SimpleAdapter(JsonActivity.this, chartItemList,
                R.layout.listview,
                new String[] { TAG_ID, TAG_ARTISTNAME }, new int[] {R.id.id, 
                    R.id.artistname });
                setListAdapter(adapter);
            }
        });
        return null;
    }

    //Removes the progress dialog when the data has been fetched
    protected void onPostExecute(String args) {
        progressDialog.dismiss();
    }
}



 }

これがlogcatです:

01-19 15:45:49.816: D/libEGL(29490): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
01-19 15:45:49.867: W/System.err(29490): org.apache.http.conn.HttpHostConnectException: Connection to     

   (http://127.0.0.1) refused
01-19 15:45:49.898: D/libEGL(29490): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
01-19 15:45:49.902: D/libEGL(29490): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
01-19 15:45:49.914: W/System.err(29490):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:183)
01-19 15:45:49.918: W/System.err(29490):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-19 15:45:49.925: W/System.err(29490):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-19 15:45:49.925: W/System.err(29490):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
01-19 15:45:49.925: W/System.err(29490):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
01-19 15:45:49.925: W/System.err(29490):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
01-19 15:45:49.929: W/System.err(29490):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
01-19 15:45:49.929: W/System.err(29490):    at com.example.jsontester.JsonParser.getJSONFromUrl(JsonParser.java:36)
01-19 15:45:49.929: W/System.err(29490):    at com.example.jsontester.JsonActivity$getChartItems.doInBackground(JsonActivity.java:83)
01-19 15:45:49.929: W/System.err(29490):    at com.example.jsontester.JsonActivity$getChartItems.doInBackground(JsonActivity.java:1)
01-19 15:45:49.933: W/System.err(29490):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-19 15:45:49.933: W/System.err(29490):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-19 15:45:49.933: W/System.err(29490):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-19 15:45:49.933: W/System.err(29490):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-19 15:45:49.933: W/System.err(29490):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-19 15:45:49.937: W/System.err(29490):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-19 15:45:49.937: W/System.err(29490):    at java.lang.Thread.run(Thread.java:856)
01-19 15:45:49.937: W/System.err(29490): Caused by: java.net.ConnectException: failed to connect to /<<127.0.0.1>> (port 80): connect failed: ECONNREFUSED (Connection refused)
01-19 15:45:49.941: W/System.err(29490):    at libcore.io.IoBridge.connect(IoBridge.java:114)
01-19 15:45:49.941: W/System.err(29490):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
01-19 15:45:49.945: W/System.err(29490):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
01-19 15:45:49.945: W/System.err(29490):    at java.net.Socket.connect(Socket.java:842)
01-19 15:45:49.945: W/System.err(29490):    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
01-19 15:45:49.957: W/System.err(29490):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
01-19 15:45:49.957: D/OpenGLRenderer(29490): Enabling debug mode 0
01-19 15:45:49.957: W/System.err(29490):    ... 16 more
01-19 15:45:49.961: W/System.err(29490): Caused by: libcore.io.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
01-19 15:45:49.972: W/System.err(29490):    at libcore.io.Posix.connect(Native Method)
01-19 15:45:49.992: W/System.err(29490):    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
01-19 15:45:49.992: W/System.err(29490):    at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
01-19 15:45:49.992: W/System.err(29490):    at libcore.io.IoBridge.connect(IoBridge.java:112)
01-19 15:45:49.992: W/System.err(29490):    ... 21 more
01-19 15:45:49.992: W/System.err(29490): java.lang.NullPointerException
01-19 15:45:49.996: W/System.err(29490):    at java.io.Reader.<init>(Reader.java:64)
01-19 15:45:49.996: W/System.err(29490):    at java.io.InputStreamReader.<init>(InputStreamReader.java:79)
01-19 15:45:50.000: W/System.err(29490):    at com.example.jsontester.JsonParser.getJSONFromUrl(JsonParser.java:51)
01-19 15:45:50.000: W/System.err(29490):    at com.example.jsontester.JsonActivity$getChartItems.doInBackground(JsonActivity.java:83)
01-19 15:45:50.007: W/System.err(29490):    at com.example.jsontester.JsonActivity$getChartItems.doInBackground(JsonActivity.java:1)
01-19 15:45:50.011: W/System.err(29490):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-19 15:45:50.011: W/System.err(29490):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-19 15:45:50.023: W/System.err(29490):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-19 15:45:50.031: W/System.err(29490):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-19 15:45:50.031: W/System.err(29490):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-19 15:45:50.035: W/System.err(29490):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-19 15:45:50.035: W/System.err(29490):    at java.lang.Thread.run(Thread.java:856)
01-19 15:45:50.039: I/System.out(29490): Json should be below me
01-19 15:45:50.050: W/System.err(29490): org.json.JSONException: End of input at character 0 of 
01-19 15:45:50.125: W/System.err(29490):    at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
01-19 15:45:50.152: W/System.err(29490):    at org.json.JSONTokener.nextValue(JSONTokener.java:97)
01-19 15:45:50.152: W/System.err(29490):    at org.json.JSONArray.<init>(JSONArray.java:87)
01-19 15:45:50.152: W/System.err(29490):    at org.json.JSONArray.<init>(JSONArray.java:103)
01-19 15:45:50.152: W/System.err(29490):    at com.example.jsontester.JsonActivity$getChartItems.doInBackground(JsonActivity.java:92)
01-19 15:45:50.152: W/System.err(29490):    at com.example.jsontester.JsonActivity$getChartItems.doInBackground(JsonActivity.java:1)
01-19 15:45:50.156: W/System.err(29490):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-19 15:45:50.156: W/System.err(29490):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-19 15:45:50.156: W/System.err(29490):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-19 15:45:50.156: W/System.err(29490):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-19 15:45:50.156: W/System.err(29490):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-19 15:45:50.156: W/System.err(29490):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-19 15:45:50.156: W/System.err(29490):    at java.lang.Thread.run(Thread.java:856)
4

2 に答える 2

0

「localhost」またはその数値形式「127.0.0.1」をユニバーサルアドレスとして使用するという古典的な間違いを犯しました。むしろ、プログラムが実行されている同じマシンにループバックするためのエイリアスです。

サーバー上で実行されているプログラムからサーバーをテストすると、127.0.0.1 が機能します。しかし、電話からそれを試みると、電話自体で実行されているサーバー プロセスに接続しようとします。

AndroidGuy が指摘しているように、Android エミュレーターで実行する場合、ホスティング開発マシンに接続するために使用できる特別なエイリアス アドレスがあります。ただし、これは物理的な Android デバイスでは利用できません。

いくつかの選択肢がありますが、どれも素晴らしいものではありません:

  • Androidデバイスをサーバーと同じwifiネットワークに配置し、サブネット上の実際のIPアドレス(通常は192.168.0.something)を介して接続できます。

  • デバイスのモバイル ネットワーク接続 (または Wi-Fi 接続) を使用して、パブリックにルーティング可能なインターネット上の実サーバーに対してテストできます。

  • デバイスのテザリング機能を「後方」に使用して、デバイスとテスト サーバーの間にサブネットを確立することを試みることができますが、サーバーの他のすべてのトラフィックをモバイル ネットワーク経由で誤って送信しないように注意してください。

  • ルート化されたデバイスで他のゲームをプレイして、カスタム トラフィック ルーティング/プロキシを実装できます

  • テストのためにAndroidデバイスでサーバーを実行できます

于 2013-01-19T16:30:19.980 に答える
0

ドメイン 127.0.0.1 により、デバイスはデバイス自体で Web サーバーを検索します。代わりに 10.0.2.2 を使用してください。

エミュレータでネットワークを使用する方法に関するリンクは次のとおりです

http://developer.android.com/tools/devices/emulator.html#emulatornetworking

于 2013-01-19T16:25:24.657 に答える