0

我想从互联网上获取 JSONArray 并将其显示在 logcat 中,所以我使用 Log.e("result ", result);

但它似乎失败了,因为我在 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;
}

}

4

2 回答 2

1

Android 不允许在 UI 线程上联网。因此,当您调用HttpResponse httpresponse = httpClient.execute(httpget);它时,它会引发android.os.NetworkOnMainThreadException异常。调用 catch 块而不是返回 null 对您来说会更有用,Log.e("error",err.printStackTrace())因为此错误将在 logcat 中显示。您需要将 try 块中的代码移动到另一个线程。我建议使用 AsyncTask。有关这方面的更多详细信息,请参阅此链接。关于 的基础知识AsyncTask:它是一个将线程和处理程序的使用从开发人员那里抽象出来的类。如果您熟悉线程和处理程序,您可以实现自己的解决方案(不是异步任务)以避免必须遵守异步任务框架工作。

于 2013-08-19T16:03:36.693 回答
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,这是一个快速教程。另外,关于它的 Google Talk

于 2013-08-19T16:35:00.140 回答