1.何时使用多线程?(耗时操作,避免主线程阻塞)
当我们进行IO操作,如文件操作,网络操作,数据库操作,以及一些复杂运算和开发定时功能,这时就需要用到多线程编程了。
2.如何使用?
接下来做一个定时功能的小Demo,
首先新建一个android project ,写一个主布局文件:main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="下面是利用多线程和handler写的一个简易计时器:" />
<TextView
android:id="@+id/tv_time"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center"
android:text="00:00"
android:textColor="@android:color/holo_orange_light"
android:textSize="25sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/btn_start"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开始" />
<Button
android:id="@+id/btn_reset"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="重置" />
</LinearLayout>
</LinearLayout>
然后在MainActivity 初始化控件和设置按钮监听事件:
package comzero.threaddemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
/**
* @author dh
*
*/
public class MainActivity extends Activity implements OnClickListener {
// 定义控件
private Button btn_start;
private Button btn_reset;
private TextView tv_time;
// 判断是否正在计时
public boolean IsStart = false;
// 走过的总秒数
public static int TOTAL = 0;
// 定义唯一时间句柄标识
public static final int TIME_HANDLER = 0x11;
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == TIME_HANDLER) {
// 接受到,主界面修改显示时间
int totals = (Integer) msg.obj;
tv_time.setText(ToTime(totals));
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initView();
//记得设置监听事件
btn_start.setOnClickListener(this);
btn_reset.setOnClickListener(this);
}
// 初始化控件
private void initView() {
btn_start = (Button) findViewById(R.id.btn_start);
btn_reset = (Button) findViewById(R.id.btn_reset);
tv_time = (TextView) findViewById(R.id.tv_time);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
// 点击开始
case R.id.btn_start:
if (!IsStart) {
new TimeThread(handler).start();
IsStart = true;
} else {
Toast.makeText(this, "你已经开始计时了!", Toast.LENGTH_LONG).show();
}
break;
// 点击重置
case R.id.btn_reset:
TOTAL = 0;
break;
default:
break;
}
}
// 把总秒数转换成00:00格式的string
private String ToTime(int time) {
String str = "";
int second = 0;
int minute = 0;
second = time % 60;
minute = time / 60;
if (minute < 10) {
if (second < 10) {
str = "0" + minute + ":" + "0" + second;
} else {
str = "0" + minute + ":" + second;
}
} else {
if (second < 10) {
str = minute + ":" + "0" + second;
} else {
str = minute + ":" + second;
}
}
return str;
}
}
新建一个TimeThread.java来写计时功能:
package comzero.threaddemo;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class TimeThread extends Thread {
private Handler handler ;
public TimeThread(Handler handler){
this.handler = handler;
}
@Override
public void run() {
// 计时功能,上限1个小时
try {
for (int i = 0; i < 3600; i++) {
Thread.sleep(1000);
MainActivity.TOTAL++;
//这里类似windows的消息机制,发一个消息到UI线程的消息队列中
Message msg = new Message();
msg.what = MainActivity.TIME_HANDLER;
msg.obj = MainActivity.TOTAL;
handler.sendMessage(msg);
}
} catch (InterruptedException e) {
Log.d("OK", e.toString());
}
}
}
这样简单的计时器就完成了,对于handler与Messge有时间再写详细的解释,一下是运行图