*********************子线程向主线程发消息**************************
描述:新建线程访问网络,将得到的信息显示在主线程的Listview中
1.网络线程
new Thread() {
@Override
public void run() {
super.run();
String str = get("http://www.imooc.com/api/teacher?type=2&cid=1");
try {
JSONObject json = new JSONObject(str);
JSONArray arr = json.getJSONArray("data");
data = new ArrayList<>();
for (int i = 0; i < arr.length(); i++) {
Map<String,Object> map=new HashMap<>();
JSONObject obj=arr.getJSONObject(i);
map.put("id",obj.getInt("id"));
map.put("name",obj.getString("name"));
data.add(map);
}
String[] from={"id","name"};
int[] to={R.id.item_id,R.id.item_name};
SimpleAdapter adapter=new SimpleAdapter(MainActivity.this,data,R.layout.item,from,to);
Message msg=new Message();
//what 标识 ,arg 数字,obj对象
msg.what=1;
msg.obj=adapter;
handler.sendMessage(msg);
} catch (JSONException e) {
e.printStackTrace();
}
}
}.start();
2.主线程
Handler handler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
list.setAdapter((SimpleAdapter)msg.obj);
}
}
};
***************************************主线程向子线程发消息***********
声明全局变量handler
在主线程调用handler.setMessage
在子线程调用handleMessage的前加上Looper.prepare,后加Looper.looper()