用Android线程做一个简单的计数器
2016.10.4
上课类容:Android线程
什么是线程?
线程或者线程执行本质上就是一串命令(也是程序代码),然后我们把它发送给操作系统执行。
一般来说,我们的CPU在任何时候一个核只能处理一个线程。多核处理器(目前大多数Android设备已经都是多核)顾名思义,就是可以同时处理多线程(通俗地讲就是可以同时处理多件事)。
多核处理与单核多任务处理的实质
上面我说的是一般情况,并不是所有的描述都是一定正确的。因为单核也可以用多任务模拟出多线程。
每个运行在线程中的任务都可以分解成多条指令,而且这些指令不用同时执行。所以,单核设备可以首先切换到线程1去执行指令1A,然后切换到线程2去执行指令2A,接着返回到线程1再去执行1B、1C、1D,然后继续切换到线程2,执行2B、2C等等,以此类推。
这个线程之间的切换十分迅速,以至于在单核的设备中也会发生。几乎所有的线程都在相同的时间内进行任务处理。其实,这都是因为速度太快造成的假象,就像电影《黑客帝国》里的特工Brown一样,可以变幻出很多的头和手。
在学习java的时候,我们接触过线程,知道线程的创建有以下两种。
一:
在Android中有两种实现线程thread的方法:
一种是,扩展Java.lang.Thread类
另一种是,实现Runnable接口
二:
Thread类代表线程类,它的两个最主要的方法是:
run()——包含线程运行时所执行的代码
Start()——用于启动线程
Android中的线程和java基本差不多,但是也有区别。
如果我们像java那样使用,就会报错。
我们定义两个类,
例:
import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv =(TextView)this.findViewById(R.id.textView1); Counter c = new Counter(tv); //启动线程 c.start(); } }
import android.util.Log; import android.widget.TextView; public class Counter extends Thread{ TextView tv; Counter(TextView tv){ this.tv = tv; } public void run(){ int i=0; while(i<=100){ //调用了TextView组件 tv.setText(i); Log.i("当前的值为:", i+""); } try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } i++; } }
如果这样运行,我们发现,模拟器就会报错。
它需要用到Handler机制。
Handler 机制,它是Runnable和Activity交互的桥梁,在run方法中发送Message,在Handler里,通过不同的Message执行不同的任务。
(Handler的设计实际上是为了应用程序内其他线程和主线程进行通信,因为只有主线程才能更新UI,其他线程不行)
例:
import android.os.Handler; import android.os.Message; import android.util.Log; public class Counter extends Thread{ Handler handler; public Counter(Handler handler){ this.handler = handler; } public void run(){ int i=0; while(i<=100){ Log.i("当前的值为:", i+""); //发送消息 Message msg = new Message(); msg.obj = "当前计数:"+i; handler.sendMessage(msg); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } i++; } } }
import android.os.Handler; import android.os.Message; import android.widget.TextView; public class CounterHandler extends Handler{ TextView tv; CounterHandler(TextView tv){ this.tv = tv; } /* * 重写处理消息的方法 */ public void handleMessage(Message msg){ String showInfo = (String)msg.obj; tv.setText(showInfo); } }
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = this.findViewById(R.id.action_settings); Handler handler = new Handler(tv); Counter c = new Counter(hander); c.start(); }