zoukankan      html  css  js  c++  java
  • android ——多线程编程

      1、定义一个线程只需要新建一个类继承自Thread。然后重写run()方法,并在里面编写耗时逻辑即可:

    class MyThread extends Thread{
       
         public void run(){
             //处理具体的逻辑
         }
     }

      启动的时候只需要new出MyThread的实例,然后调用它的start()方法,这样run()中写的代码就会在子线程中进行:

    new Mythread().start();

      2、更多时候使用实现Runnable接口的方式来定义一个线程

    class MyThread implements Runnable {
    
        public void run() {
               //处理具体的逻辑     
        }
    }        

      如果使用了这种写法,启动线程的方法也要进行相应的改变:

    MyThread mythread = new MyThread();
    new Thread(mythread).start();

      Thread的构造函数接收了一个Runnable参数,MyThread正是一个实现了Runnable接口的对象,所以直接将它传入Thread的构造函数里,紧接着调用start()方法,run()中的代码就会在子线程中运行了。

      3、如果不想专门再定义一个类去实现Runnable接口,也可以使用匿名类的方式:

    new Thread (new Runnable() {
    
        public void run() {
               //处理具体的逻辑     
        }
    }).start();    

      例如:在子线程中更新UI,

      android的UI是线程不安全的,也就是说如果想要更新应用程序里的UI元素,就必须要在主线程中进行,否则就会出现意外。

      验证一下就是:先在布局中加入一个按钮和一个文本控件,

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     android:layout_width="match_parent"
     3     android:layout_height="match_parent">
     4 
     5 
     6     <Button
     7         android:id="@+id/chage_text"
     8         android:layout_width="match_parent"
     9         android:layout_height="wrap_content"
    10         android:text="改变文字" />
    11 
    12     <TextView
    13         android:id="@+id/textView"
    14         android:layout_width="wrap_content"
    15         android:layout_height="wrap_content"
    16         android:layout_centerInParent="true"
    17         android:text="这是一段文字" 
    18         android:textSize="20sp"/>
    19 </RelativeLayout>

      然后是java代码:

     1 public class MainActivity extends AppCompatActivity {
     2     @Override
     3     protected void onCreate(Bundle savedInstanceState) {
     4         super.onCreate(savedInstanceState);
     5         setContentView(R.layout.activity_main);
     6         
     7         //注册按钮和文本控件
     8         Button changeText = (Button) findViewById(R.id.chage_text);
     9         final TextView textView = (TextView) findViewById(R.id.textView);
    10         
    11         //按钮响应
    12         changeText.setOnClickListener(new View.OnClickListener() {
    13             @Override
    14             public void onClick(View view) {
    15                 
    16                 //开启一个子线程
    17                 new Thread(new Runnable() {
    18                     @Override
    19                     public void run() {
    20                         
    21                         //修改文本控件中的文本
    22                         textView.setText("这是另一段文字");
    23                     }
    24                 }).start();
    25             }
    26         });
    27     }
    28 }

      然后安装到手机上,然后就崩溃了,前面就说过要改变UI就需要在主线程中去改变。这时候就需要使用一套异步消息处理机制,也就是子线程中发送消息给Handler,然后Handler识别消息再去进行相应的操作。

     1 public class MainActivity extends AppCompatActivity {
     2 
     3     public static final int UPDATA_TEXT = 1;
     4 
     5     private TextView textView;
     6 
     7     private Handler handler = new Handler(){
     8 
     9         public void handleMessage(Message msg){
    10             switch (msg.what){
    11                 case UPDATA_TEXT:
    12                     textView.setText("这是另一段文字");
    13                     break;
    14                 default:
    15                     break;
    16             }
    17         }
    18     };
    19     @Override
    20     protected void onCreate(Bundle savedInstanceState) {
    21         super.onCreate(savedInstanceState);
    22         setContentView(R.layout.activity_main);
    23 
    24         //注册按钮和文本控件
    25         Button changeText = (Button) findViewById(R.id.chage_text);
    26        textView = (TextView) findViewById(R.id.textView);
    27 
    28         //按钮响应
    29         changeText.setOnClickListener(new View.OnClickListener() {
    30             @Override
    31             public void onClick(View view) {
    32 
    33                 //开启一个子线程
    34                 new Thread(new Runnable() {
    35                     @Override
    36                     public void run() {
    37                         Message message = new Message();
    38                         message.what = UPDATA_TEXT;
    39                         handler.sendMessage(message);//将Message对象发送出去
    40                     }
    41                 }).start();
    42             }
    43         });
    44     }
    45 }

      先创建一个Handler对象,并重写handleMessage方法用于对具体Message的处理,在这里对UI进行改变,然后在子线程中创建一个Message对象,将Message的what字段指定为提取设置好的值,然后调用handler的sendMessage()方法发送出去。

      

  • 相关阅读:
    [Eclipse]GEF入门系列(四、其他功能)
    [Eclipse]GEF入门系列(三、应用实例)
    [Eclipse]GEF入门系列(一、Draw2D)
    打开Win2000的自动补齐功能
    让URLConnection使用代理服务器
    [Eclipse]GEF入门系列(序)
    给表格的单元格增加编辑功能(In place edit)
    设置Eclipse RCP程序的外观和首选项
    利用winrar自动备份重要资料(续,经验技巧)
    终于换了新电脑
  • 原文地址:https://www.cnblogs.com/xxbbtt/p/7467078.html
Copyright © 2011-2022 走看看