解析Android中线程的好处

来源:互联网 发布:存脐带血有必要吗 知乎 编辑:程序博客网 时间:2024/05/01 16:06



关于线程相信不用多做解释了,看看本文吧!

AD:干货来了,不要等!WOT2015 北京站演讲PPT开放下载!


    一、Android有两种方式处理线程:

    比较耗时的操作放在后台服务,通过通知机制通知用户使用的活动(activity);在后台线程中处理耗时的操作

    二、使用Handler

    创建后台线程最友好的办法是创建一个Handler子类的实例。只需一个Handler对应一个Activity。自定义的后台线程可与Handler通信,Handler将与UI线程一起工作。和Handler通信,需要两个选项,message和runnable对象。

    三、Message 

    发送Message到Handler,第一步调用obtainMessage(),从池中得到Message对象。

    然后,可通过消息队列将Message发送给Handler,通过sendMessage…()方法族:

    sendMessage() 立即发送Message到消息队列

    sendMessageAtFrontOfQueue() 立即发送Message到队列,而且是放在队列的最前面

    sendMessageAtTime() 设置时间,发送Message到队列

    sendMessageDelayed() 在延时若干毫秒后,发送Message到队列

    为了处理Message,Handler需要实现handleMessage(),当Message出现在队列中时,会调用handleMessage()方法。另外,Handler可在需要时更新UI。

    以下示例演示一个进度条,每隔1秒钟增加1/20个单位。效果图:

     

    java代码:

    1. <?xml version="1.0" encoding="utf-8"?> 
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    3. android:orientation="vertical"   
    4. android:layout_width="fill_parent" 
    5. android:layout_height="fill_parent"> 
    6. <ProgressBar   
    7. android:id="@+id/progress" 
    8. style="?android:attr/progressBarStyleHorizontal"   
    9. android:layout_width="fill_parent" 
    10. android:layout_height="wrap_content" /> 
    11. </LinearLayout> 

    java代码:

    1. package eoe.demo;  
    2. import android.app.Activity;  
    3. import android.os.Bundle;  
    4. import android.os.Handler;  
    5. import android.os.Message;  
    6. import android.widget.ProgressBar;  
    7. public class ShowThread extends Activity {  
    8. ProgressBar bar;  
    9. Handler handler = new Handler() {  
    10. @Override  
    11. public void handleMessage(Message msg) {  
    12. bar.incrementProgressBy(5);  
    13. }  
    14. };  
    15. boolean isRunning = false;  
    16. /** Called when the activity is first created. */  
    17. @Override  
    18. public void onCreate(Bundle savedInstanceState) {  
    19. super.onCreate(savedInstanceState);  
    20. setContentView(R.layout.main);  
    21. bar = (ProgressBar) findViewById(R.id.progress);  
    22. }  
    23. @Override  
    24. protected void onStart() {  
    25. super.onStart();  
    26. bar.setProgress(0);  
    27. Thread background = new Thread(new Runnable() {  
    28. @Override  
    29. public void run() {  
    30. for (int i = 0; i < 20 && isRunning; i++) {  
    31. try {  
    32. Thread.sleep(1000);  
    33. } catch (InterruptedException e) {  
    34. }  
    35. handler.sendMessage(handler.obtainMessage());  
    36. }  
    37. }  
    38. });  
    39. isRunning = true;  
    40. background.start();  
    41. }  
    42. @Override  
    43. protected void onStop() {  
    44. super.onStop();  
    45. isRunning = false;  
    46. }  

    小结:

    当第一次启动一个android程序是,android会自动创建一个称为“main”主线程的线程。这个线程很重要,因为它负责吧时间分派到相应对控件,其中就包括屏幕绘图时间,它同样是用户与android控件交互的线程。

    0 0