[Android]Thread线程入门3--多线程
16lz
2022-03-26
经过
[Android]Thread线程入门1和 [Android]Thread线程入门2的学习,我们对线程有了简单的了解。在实际应用中,一般都会用到多线程。很少像前面的例子这么简单。那么如何实现多线程呢? 我们稍微修改一下前面的例子。假设我们要同时运行4个线程。每个线程对应一个TextView。如下图所示:每一个线程对应一个TextView。当点击Start Thread按钮,四个线程开始启动。对应的TextView分别加1. Layout文件如下: <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
android:layout_width= "fill_parent"
android:layout_height= "fill_parent"
android:orientation= "vertical" >
<Button android:id= "@+id/btnStart"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:text= "Start Thread" />
<Button android:id= "@+id/btnStop"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:text= "Stop Thread" />
<TextView
android:layout_width= "fill_parent"
android:layout_height= "wrap_content"
android:textSize= "30dip"
android:textColor= "#ffff0000"
android:text= "0"
android:layout_marginLeft= "30dip"
android:id= "@+id/txtShow1" />
<TextView
android:layout_width= "fill_parent"
android:layout_height= "wrap_content"
android:textSize= "30dip"
android:textColor= "#ffff0000"
android:text= "0"
android:layout_marginLeft= "30dip"
android:id= "@+id/txtShow2" />
<TextView
android:layout_width= "fill_parent"
android:layout_height= "wrap_content"
android:textSize= "30dip"
android:textColor= "#ffff0000"
android:text= "0"
android:layout_marginLeft= "30dip"
android:id= "@+id/txtShow3" />
<TextView
android:layout_width= "fill_parent"
android:layout_height= "wrap_content"
android:textSize= "30dip"
android:textColor= "#ffff0000"
android:text= "0"
android:layout_marginLeft= "30dip"
android:id= "@+id/txtShow4" />
</LinearLayout>
源代码如下: public class TestThreadActivity extends Activity {
private MyHandler mHandler = null;;
//4个TextView
private TextView mTextView1;
private TextView mTextView2;
private TextView mTextView3;
private TextView mTextView4;
private Button mButtonStart;
private Button mButtonStop;
//对应4个计数器
private int mSecond1 = 0;
private int mSecond2 = 0;
private int mSecond3 = 0;
private int mSecond4 = 0;
private boolean mStop = false;
@Override
public void onCreate( Bundle savedInstanceState) {
super . onCreate( savedInstanceState);
setContentView( R . layout . main);
mHandler = new MyHandler();
//绑定TextView
mTextView1 = ( TextView) findViewById( R . id . txtShow1);
mTextView2 = ( TextView) findViewById( R . id . txtShow2);
mTextView3 = ( TextView) findViewById( R . id . txtShow3);
mTextView4 = ( TextView) findViewById( R . id . txtShow4);
mButtonStart = ( Button) findViewById( R . id . btnStart);
mButtonStop = ( Button) findViewById( R . id . btnStop);
mButtonStart . setOnClickListener( new View . OnClickListener() {
public void onClick( View v) {
//启动多线程
startMultiThread();
}
});
mButtonStop . setOnClickListener( new View . OnClickListener() {
public void onClick( View v) {
stopThread();
}
});
}
private void startMultiThread()
{
//启动4个线程
new MyThread (). start();
new MyThread (). start();
new MyThread (). start();
new MyThread (). start();
}
private void stopThread()
{
mStop = true;
}
private class MyHandler extends Handler
{
@Override
public void handleMessage( Message msg)
{
switch( msg . what)
{
case 1 :
{
//暂且第一个textview加1,其余textview不变
mTextView1 . setText( Integer . toString( mSecond1 ++));
mTextView2 . setText( Integer . toString( mSecond2));
mTextView3 . setText( Integer . toString( mSecond3));
mTextView4 . setText( Integer . toString( mSecond4));
break;
}
}
}
}
private class MyThread extends Thread
{
@Override
public void run()
{
Log . i( "test" , "threadid=" + this . currentThread (). getId());
while (! mStop)
{
try
{
Thread . sleep( 1000);
}
catch( InterruptedException e)
{
e . printStackTrace();
}
Message msg = new Message();
msg . what = 1;
//send message
mHandler . sendMessage( msg);
}
if( mStop)
{
this . interrupt();
}
}
}
} 点击Start Thread按钮,是不是和我们设想的一样,第一个TextView加1,其余textView的数值不变呢?
观察上面图片,我们可以看到,数值并不是加1,明显是以加4的速度递增。为什么呢? 因此4个线程都在运行中,每个线程都对这个变量加1,所以我们就看到以4递增。那如何让变量还是以加1递增呢?我们修改代码如下: private class MyHandler extends Handler
{
@Override
public void handleMessage( Message msg)
{
switch( msg . what)
{
case 1 :
{
//mSecond ++; //second increase
//显示传递出来的数字msg.arg1.而不再自己计数
mTextView1 . setText( Integer . toString( msg . arg1));
mTextView2 . setText( Integer . toString( msg . arg1));
mTextView3 . setText( Integer . toString( msg . arg1));
mTextView4 . setText( Integer . toString( msg . arg1));
break;
}
}
}
}
private class MyThread extends Thread
{
//在线程里声明一个变量,用来计数
private int mSecond = 0;
@Override
public void run()
{
Log . i( "test" , "threadid=" + this . currentThread (). getId());
while (! mStop)
{
try
{
Thread . sleep( 1000);
}
catch( InterruptedException e)
{
Log . e( "test" , "enter run exception:" + e . getLocalizedMessage());
e . printStackTrace();
}
//每隔1秒加1
mSecond ++;
//Log.i("test", "enter run 2");
Message msg = Message . obtain();
msg . what = 1;
msg . arg1 = mSecond; //将数值传递出去
//send message
mHandler . sendMessage( msg);
}
if( mStop)
this . interrupt();
}
} 运行后就会发现四个TextView都是以加1的速度整齐划一的变换着。
这时候,我们希望每一个TextView都有自己的数字显示。那么应该如何实现呢?请看下篇博文。
更多相关文章
- Android(安卓)Handler机制 - handleMessage究竟在哪个线程执行
- Android的两种数据存储方式分析(二)
- android 异步获取图片
- 实战技巧:Android异步指南
- Android面试系列文章2018之Android部分HandlerThread机制篇
- Android的性能优化方法
- Android四大组件之Service调优及进程保活(含Demo - Kotlin版)
- handle的用法
- Handler与异步消息处理