为什么我不能从网上获取JSONArray

时间:2013-08-19 15:56:39

标签: android

我想从互联网上获取JSONArray并在logcat中显示它,所以我使用 Log.e(“结果”,结果);

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

}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

自从Android 3.0以来,默认情况下已启用StrictMode。它的作用是禁止开发人员做懒惰的事情,比如在UI线程上运行网络代码。它会强制您异步运行此类代码,以便应用程序不会挂起/暂停,并且用户交互不会中断。你可以关闭它,这样你就不需要使用AsyncTask / Handler / Volley /等等。处理它是一种糟糕的方式,但这是一种方法(不要这样做):

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