2013-01-19 9 views
0

我正在構建一個應用程序,它將解析器json從數據庫中轉換爲列表視圖。我已經使用PHP腳本來編碼在下面的JSON格式從數據庫中的數據:從Android向本地服務器發出請求時的連接錯誤

[ 
{"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) 
+0

這裏是logcat的: – AndroidEnthusiast

回答

0

域127.0.0.1會導致設備在設備本身上查找Web服務器。改爲使用10.0.2.2。

下面是關於如何在

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

+0

對的問題,錯誤的解決方案10.0.0.2是僅適用於emualators的轉發別名。 –

+0

@ChrisStratton對不起,我有點困惑,你的意思是他們都不會工作? – AndroidEnthusiast

+0

@AndroidEnthusiast - 是的,那些轉發地址只適用於模擬器,而不是在物理的Android設備上(除了可能有人設置了非同尋常的網絡的根源) –

0

你已經做了使用「本地主機」或它的數字形式的「127.0.0.1」作爲通用地址的經典錯誤模擬器使用網絡的鏈接。它不是,而是它是循環回到程序運行的同一臺機器上的別名。

當您從運行在服務器上的程序測試服務器時,127.0.0.1可以使用。但是,當你通過手機嘗試時,它會嘗試聯繫在手機上運行的服務器進程。

正如AndroidGuy指出的那樣,當您在Android模擬器上運行時,您可以使用特殊的別名地址來聯繫宿主開發機器。但這不適用於實體Android設備。

你有幾個選擇,他們沒有偉大:

  • 你可以把相同的WiFi網絡服務器上的Android設備,並通過其真實IP地址(聯繫子網中的典型192.168.0.something)。

  • 您可以使用設備上的移動網絡連接(或WiFi連接)在可公開路由的Internet上測試真實服務器。

  • 您可以嘗試在設備上「向後」使用網絡共享功能在設備和測試服務器之間建立子網,但要非常小心您不會意外通過移動網絡發送所有服務器的其他流量。

  • 你可以玩一些其他遊戲紮根設備上實現自定義的流量路由/代理

  • 可以運行在Android設備上的服務器進行測試

+0

將看到這些謝謝。 – AndroidEnthusiast

相關問題