欢迎来到天天文库
浏览记录
ID:17774526
大小:76.00 KB
页数:9页
时间:2018-09-05
《android通过两种方法开启一个线程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、android通过两种方法开启一个线程大家都知道,在PC上的应用程序当需要进行一些复杂的数据操作,但不需要界面UI的时候,我们会为应用程序专门写一个线程去执行这些复杂的数据操作。通过线程,可以执行例如:数据处理、数据下载等比较耗时的操作,同时对用户的界面不会产生影响。在Android应用程序开发中,同样会遇到这样的问题。当我们需要访问网络,从网上下载数据并显示在我们的UI上时,就会启动后台线程去下载数据,下载线程执行完成后将结果返回给主用户界面线程。 对于线程的控制,我们将介绍一个Handler类,使用该类可以对运行在不同线程中的多个任务进行排队,并使用Message和Runnabl
2、e对象安排这些任务。在javadoc中,对Handler是这样解释的:Handler可以发送和处理消息对象或Runnable对象,这些消息对象和Runnable对象与一个线程相关联。每个Handler的实例都关联了一个线程和线程的消息队列。当创建了一个Handler对象时,一个线程或消息队列同时也被创建,该Handler对象将发送和处理这些消息或Runnable对象。 下面有几种对Handler对象的构造方法需要了解一下:a、如果new一个无参构造函数的Handler对象,那么这个Handler将自动与当前运行线程相关联,也就是说这个Handler将与当前运行的线程使用同一个消息队列
3、,并且可以处理该队列中的消息。privateHandlerhandler=newHandler(); 我们做这样一个实验,在主用户界面中创建一个带有无参构造函数的Handler对象,该Handler对象向消息队列推送一个Runnable对象,在Runnable对象的run函数中打印当前线程Id,我们比较主用户界面线程ID和Runnable线程ID是否相同。具体代码如下:publicclassHandlerTest01extendsActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(
4、savedInstanceState);setContentView(R.layout.main);System.out.println("Activity—>"+Thread.currentThread().getId());handler.post(r);}privateHandlerhandler=newHandler();privateRunnabler=newRunnable(){@Overridepublicvoidrun(){try{Thread.sleep(2000);}catch(InterruptedExceptione){//TODOAuto-generatedc
5、atchblocke.printStackTrace();}System.out.println("Runnalbe—>"+Thread.currentThread().getId());}};} 通过这个例子的输出可以发现,Runnable对象和主用户界面线程的ID是相同。在这个例子中,我们直接利用handler对象post了一个runnable对象,相当于直接调用了Runnable对象的run函数,也就说没有经过start函数调用run(),那么就不会创建一个新线程,而是在原有线程内部直接调用run()方法,因此输出的线程Id是相同的。b、如果new一个带参构造函数的Handler
6、对象,那么这个Handler对象将与参数所表示的Looper相关联。注意:此时线程类应该是一个特殊类HandlerThread类,一个Looper类的Thread类,它继承自Thread类。HandlerThreadhandlerthread=newHandlerThread("MyThread");handlerthread.start();privateMyHandlerhandler=newMyHandler(handlerthread.getLooper());classMyHandlerextendsHandler{publicMyHandler(){}publicMyHan
7、dler(Looperlooper){super(looper);}}下面这个例子,将介绍如何开启一个新的线程,并通过Handler处理消息。 HandlerTest02.javapublicclassHandlerTest02extendsActivity{privateMyHandlermyhandler=null;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){//TOD
此文档下载收益归作者所有