之前做项目时需要从网络获取数据填充listview显示,因为没有网络框架的使用,直接在子线程中获取了数据便进行填充,发现数据不显示.使用handler消息机制更改后,界面显示,基本的handler使用方法,开一个子线程获取一下数据,然后传递到主线程更新ui,主要代码如下:
1 public class MainActivity extends Activity {
2 3 private ListView listView; 4 private List<String> member; 5 private ListAdapter adapter; 6 private Handler handler=null; 7 9 @SuppressLint("HandlerLeak")10 protected void onCreate(Bundle savedInstanceState) {11 super.onCreate(savedInstanceState);12 setContentView(R.layout.main);13 14 listView=(ListView) super.findViewById(R.id.listview);15 //cache=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/cache");16 17 //开一条子线程加载网络数据18 Runnable runnable=new Runnable()19 {20 public void run() 21 {22 try 23 {24 //获取网络数据的地方
27 //发送消息,并把persons结合对象传递过去
28 handler.sendMessage(handler.obtainMessage(0, persons));
29 }
30 catch (InterruptedException e)
31 {
32 e.printStackTrace();
33 }
34 }
35 };
36
37 try
38 {
39 //开启线程
40 new Thread(runnable).start();
41 //handler与线程之间的通信及数据处理
42 handler=new Handler()
43 {
44 public void handleMessage(Message msg)
45 {
46 if(msg.what==0)
47 {
48 //msg.obj是获取handler发送信息传来的数据
49 @SuppressWarnings("unchecked")
//接受网络数据的地方
50 ArrayList<String> member=(ArrayList<String>) msg.obj;
51 //给ListView绑定数据
52 BinderListData(member);
53 }
54 }
55 };
56 }
57 catch (Exception e)
58 {
59 e.printStackTrace();
60 }
61 }
62
63 //绑定数据
64 public void BinderListData(ArrayList<Person> person)
65 {
66 //创建adapter对象
67 adapter=new ListViewAdapter(R.layout.item,this,member);
68 //将Adapter绑定到listview中
69 listView.setAdapter(adapter);
70 }
71
72 }