- package com.example.multithreadind01;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- private String fromDb_str1 = "";
- private Button btn;
- private TextView tv;
- private ListView lv;
- private BaseAdapter adapter;
- private List userList = new ArrayList();
- private Runnable doInBackground1;
- private Runnable doInBackground2;
- //1.跟着主线程走,可以碰UI
- //2.能够接受子线程发送的消息(Message)
- // 子线程类本身不可以发信息
- private Handler handler;
- @Override protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Log.i("UI_MainThread", "id:" + Thread.currentThread().getId());
- for (int i = 0; i < 5; i++) {
- User u = new User();
- u.setUsername("小明" + i);
- u.setSex("女" + i);
- userList.add(u);
- }
- tv = (TextView) findViewById(R.id.textView1);
- btn = (Button) findViewById(R.id.button1);
- btn.setOnClickListener(new OnClickListener() {
- @Override public void onClick(View v) {
- //1.访问数据库或者互联网(但会卡的)
- //2.更新界面
- Thread t1 = new Thread(doInBackground1);
- t1.start();
- Thread t2 = new Thread(doInBackground2);
- t2.start();
- }
- });
- adapter = new BaseAdapter() {@Override public int getCount() {
- // TODO Auto-generated method stub
- return userList.size();
- }@Override public View getView(int position, View convertView, ViewGroup parent) {
- LayoutInflater inflater = MainActivity.this.getLayoutInflater();
- View view;
- if (convertView == null) {
- view = inflater.inflate(R.layout.item, null);
- } else {
- view = convertView;
- }
- TextView tv_username = (TextView) view.findViewById(R.id.username);
- TextView tv_sex = (TextView) view.findViewById(R.id.sex);
- tv_username.setText(userList.get(position).getUsername());
- tv_sex.setText(userList.get(position).getSex());
- return view;
- }
- @Override public Object getItem(int position) {
- // TODO Auto-generated method stub
- return null;
- }@Override public long getItemId(int position) {
- // TODO Auto-generated method stub
- return 0;
- }
- };
- lv = (ListView) findViewById(R.id.listView1);
- lv.setAdapter(adapter);
- handler = new Handler() {
- //1.消息msg来自于子线程
- //2.消息可以多个,采用msg.what识别
- //3.处理消息,一般就会更新UI
- //4.此方法可以参考onPostExecute
- @Override public void handleMessage(Message msg) {
- super.handleMessage(msg);
- int msgwhat = msg.what;
- Log.i("handler", "已经收到消息,消息what:" + msgwhat + ",id:" + Thread.currentThread().getId());
- if (msgwhat == 1) {
- //更新helloworld
- tv.setText("子线程让我更新" + msgwhat);
- }
- if (msgwhat == 2) {
- //更新ListView
- adapter.notifyDataSetChanged();
- }
- }
- };
- //子线程代码1
- doInBackground1 = new Runnable() {
- @Override public void run() {
- Log.i("sub_Thread", "子线程1启动,id:" + Thread.currentThread().getId());
- try {
- Thread.sleep(3000);
- } catch(InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //1.访问数据库或者互联网,不在UI进程,所以不卡
- Message msg = new Message();
- //对消息一个识别号,便于handler能够识别
- msg.what = 1;
- handler.sendMessage(msg);
- Log.i("sub_Thread", "子线程1已经发送消息给handler");
- }
- };
- //子线程代码1
- doInBackground2 = new Runnable() {
- @Override public void run() {
- Log.i("sub_Thread", "子线程2启动,id:" + Thread.currentThread().getId());
- try {
- Thread.sleep(6000);
- } catch(InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- Message msg = new Message();
- //对消息一个识别号,便于handler能够识别
- msg.what = 2;
- //handler.sendMessage(msg);
- handler.sendMessageDelayed(msg, 500);
- //访问互联网,下载最新的,更新data,但不碰界面
- for (User user: userList) {
- user.setSex("女");
- }
- Log.i("sub_Thread", "子线程2已经发送消息给handler");
- }
- };
- }
- }
来源: http://www.bubuko.com/infodetail-1862320.html