在listView中显示json数据出现的问题及解决方法

在listView中显示json数据出现的问题及解决方法

  问题描述:在listView中加载解析的json数据,出现了一种很奇怪的现象:解析的json数据在模拟器中能够正常显示,但是却在真机中无法显示,一片空白

  问题分析:原因是请求网络数据是异步的,程序在解析json数据时,仍然会往下执行,导致json数据还没解析完就提前执行了adapter对象的创建,导致在创建adapter对象时传入的newsList大小为空,于是没有任何数据显示

new Thread(new Runnable() {
        @Override
        public void run() {
            getNewsInfo();//这里在进行json数据解析
        }
    }).start();
NewsAdapter adapter = new NewsAdapter(MainActivity.this, R.layout.listview_item, newsList);
listView.setAdapter(adapter);

  解决方案使用异步消息处理机制,在解析完json数据获取到newsList后,利用handler将消息抛出,然后在处理消息函数handleMessage()中创建adapter并设置listView的adapter

try {
        //解析json数据,一定要在子线程中解析json数据
        JSONObject ob = new JSONObject(jsonData);
        JSONArray newslist = ob.getJSONArray("newslist");
        JSONObject content = null;

        for (int j = 0; j < newslist.length(); j++) {
            content = newslist.getJSONObject(j);
            String ctime = content.getString("ctime");
            String title = content.getString("title");
            News news = new News(R.drawable.apple_pic, title, ctime);
            newsList.add(news);
            Log.i("sdkdemo", ctime);
            Log.i("sdkdemo", title);
        }
        //解析json数据后抛出消息
        Message message = new Message();
        message.what = UPDATE;
        handler.sendMessage(message);
    } catch (JSONException e) {
        e.printStackTrace();
}
listView = (ListView) findViewById(R.id.list_view);
new Thread(new Runnable() {
    @Override
    public void run() {
        getNewsInfo();//解析json数据
    }
}).start();
handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what)
        {
            case UPDATE:
                NewsAdapter adapter = new NewsAdapter(MainActivity.this, R.layout.listview_item, newsList);
                listView.setAdapter(adapter);
                break;
            default:
                break;
        }
    }
};

  这时,只有在解析json数据后才会执行adapter的创建,不会导致传入的newsList为空

  扩展:异步消息处理机制可以解决子线程更新UI的问题,在子线程中不能够更新UI的,可以利用异步消息处理机制来解决。

  异步消息处理机制原理:更新UI的操作需要在主线程中运行。当子线程需要更新UI时,创建一个Message消息,利用handler将消息发送出去,之后这条消息就会被添加到MessageQueue的队列中等待被处理,而Looper就会一直尝试从MessageQueue中取出待处理消息,最后分发回handler的handlerMessage()方法中。由于Handler是在主线程中创建的,所以此时handlerMessage()方法也在主线程中执行,那么就可以进行UI操作了。

image

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值