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();
    }
}



 }

这是日志猫:

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

域 127.0.0.1 使设备在设备本身上查找 Web 服务器。请改用 10.0.2.2。

这是有关如何在模拟器中使用网络的链接

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

于 2013-01-19T16:25:24.657 回答
0

您犯了使用“localhost”或其数字形式“127.0.0.1”作为通用地址的典型错误。它不是,而是一个别名,用于循环回运行程序的同一台机器。

当您从服务器上运行的程序测试服务器时,127.0.0.1 有效。但是,当您通过手机尝试时,它会尝试联系手机本身上运行的服务器进程。

正如 AndroidGuy 所指出的,当你在 Android 模拟器上运行时,有一个特殊的别名地址可以用来联系宿主开发机器。但这不适用于物理 Android 设备。

您有几个选择,但都不是很好:

  • 您可以将 android 设备与服务器放在同一个 wifi 网络上,并通过子网上的真实 IP 地址(通常为 192.168.0.something)联系它。

  • 您可以使用设备上的移动网络连接(或 wifi 连接)在可公开路由的 Internet 上针对真实服务器进行测试。

  • 您可以尝试“向后”使用设备上的网络共享功能在设备和测试服务器之间建立子网,但要非常小心,不要意外通过移动网络发送服务器的所有其他流量。

  • 您可以在有根设备上玩其他游戏来实现自定义流量路由/代理

  • 你可以在安卓设备上运行服务器进行测试

于 2013-01-19T16:30:19.980 回答