Listview的异步加载

整体页面的异步加载,因为我的listview里面配置的全是文字,没有图片,所以没有用到asynctask这个异步加载类,而是直接使用handlermessage,和线程

用也用到了progressbar,因为progressbar是转动的所以没必要为progressbar内的数值等添加数值

下面是代码

private void initasynctask(final LayoutInflater inflater) {
		type = getArguments().getString("type");

		get_list = new GetCsongList();

		// 分配新线程
		Thread thread = new Thread(asynctask());

		// 开启新线程
		thread.start();

		// 初始化list
		handler = new Handler() {
			public void handleMessage(Message msg) {
				if (msg.what == 1) {

					initlist(inflater);

					rela_play_promt.setVisibility(View.INVISIBLE);
				}
			}
		};
	}
private void initlist(LayoutInflater inflater) {

		mData = mlist;

		maAdapter = new Details_musicinfo_adapter(mlist, getActivity(),
				VIEW_COUNT, index);

		// 为Listview加上head
		View headerView = inflater.inflate(R.layout.layout_music_info_title,
				null);

		lv_csong.addHeaderView(headerView, null, false);

		lv_csong.setAdapter(maAdapter);

		total_page = mData.size() / 10 + 1;

		tv_pg_total.setText(total_page + "");

		tv_pg_current.setText(1 + "");
 }
private Runnable asynctask() {
		Runnable myRun = new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				// 拿到主线程Handler的Message
				// 获取数据
				mlist = get_list
						.getCsongList("http://192.168.0.190:8080/rainbowbj/SongList?type="
								+ type);

				

				// 将消息发送给主线程的Handler
				handler.sendEmptyMessage(1);
				
			}
		};
		return myRun;
	}

其实异步加载,在我的理解,就是UI线程会去先去绘制整个UI,当UI绘制完毕后,因为也绘制出了Progressbar(所以Progressbar在转动),但UI线程的工作已经做完了,但是开启的子线程事实上还在工作,它把所有的数据都传输了过来,然后添加到Adapter中,做完这些工作以后他会通知一下主线程,这里就用到了handler()。主线程维护的LOOPER接收到了子线程发送的消息,发现这不会使UI线程阻塞住,所以同意更改。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值