2013-08-19 158 views
0

我想從互聯網獲取JSONArray並將其顯示在logcat中,因此我使用 Log.e(「result」,result);爲什麼我無法從網絡獲取JSONArray

但它似乎失敗,因爲我找不到logcat中的任何JSONArraay 這是我的代碼,我希望你能看看並告訴我什麼是錯的? 我知道你們中的一些使用BufferReader讀取來自互聯網 文字,但我想我的方式也應該確定

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button btnParse; 
    ListView listResult; 

    btnParse = (Button) findViewById(R.id.btn_parse); 

    listResult = (ListView) findViewById(R.id.list_result); 

    btnParse.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      JSONArray trial = getJSONData(); 

     } 
    }); 

} 

private JSONArray getJSONData() { 

    String url = "http://cloud.culture.tw/frontsite/trans/SearchShowAction.do?method=doFindAllTypeJ"; 
    DefaultHttpClient httpClient = new DefaultHttpClient(); 
    HttpGet httpget = new HttpGet(url); 

    try { 

     HttpResponse httpresponse = httpClient.execute(httpget); 

     String result = EntityUtils.toString(httpresponse.getEntity()); 
     Log.e("result ", result); 

     JSONArray jsonarr = new JSONArray(result); 
     return jsonarr; 

    } catch (Exception err) { 
     return null; 

    } 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

}

+0

您是否記得在應用程序的清單中請求'INTERNET'權限? – Devunwired

+0

打印例外,而不是丟棄它們,例如Log.e(「yourtag」,「取出時取消」,err);'在返回null之前'。 – dst

回答

1

的Android不允許在UI線程上網絡。因此,當您撥打HttpResponse httpresponse = httpClient.execute(httpget);這是拋出一個android.os.NetworkOnMainThreadException例外。在catch塊中調用Log.e("error",err.printStackTrace())而不是返回null會更有用,因爲這個錯誤會在logcat中顯示。您需要將try塊中的代碼移動到另一個線程。我建議使用一個AsyncTask。有關詳細信息,請參閱此link。關於AsyncTask的基礎知識:它是一個將開發人員遠離線程和處理程序的類抽象出來的類。如果您熟悉線程和處理程序,則可以實現自己的解決方案(而不是異步任務),以避免必須符合asynctask框架工作。

+0

如果我寫我自己的DefaultHttpClient,如 私人DefaultHttpClient gethttpclient(){ } 和我使用returnDefaultHttpClient.execute(httpget); 問題能解決嗎? –

+0

劑量這意味着每次我想連接到互聯網在Android上我必須使用AsyncTask來完成。 –

+0

@海志李不,創建一個單獨的方法不會自動將它移動到一個新線程。該調用仍然是同步的(阻塞),並會導致UI掛起。你需要使用一個處理程序或異步任務或其他方法來生成另一個線程...... Volley甚至...如果你想要一個簡單的解決方案,這是一個壞主意,關閉嚴格模式... – Tonithy

0

從Android 3.0開始,StrictMode默認已啓用。它的作用是禁止開發者做懶惰的事情,比如在UI線程上運行網絡代碼。它迫使你異步運行這樣的代碼,以便應用程序不會掛起/暫停,並且用戶交互不會中斷。你可以關閉它,這樣你就不需要使用AsyncTask/Handler/Volley/whatever。這是一個不錯的方法來處理它,但這裏的一個辦法做到這一點(不這樣做):

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); // Put these two lines before you execute your HTTTP request.... 

而是執行此操作: 使用Volley,這裏有一個quick tutorial。另外,a Google Talk about it

相關問題