整体页面的异步加载,因为我的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线程阻塞住,所以同意更改。