• Android多线程编程<一>Android中启动子线程的方法


     
        我们知道在Android中,要更新UI只能在UI主线程去更新,而不允许在子线程直接去操作UI,但是很多时候,很多耗时的工作都交给子线程去实现,当子线程执行完这些耗时的工作后,我们希望去修改UI,但Android中又不允许在子线程中去直接修改UI,如:在子线程中执行从服务器下载一张图片的任务,下载完成后,希望这张图片显示一个ImageView上,在子线程中又不能直接操作ImageView,这怎么办呢?我们只能把这张图片发送给UI主线程,然后在主线程中去显示这张图片。为了能够实现这种子线程和主线程之间的数据交换,Android提供了异步消息处理机制来解决这个问题。Android的异步消息处理机制如:Handler异步消息处理机制和AsyncTask异步任务(内部实现也是基于异步消息处理机制)。Handler异步消息处理机制由Message,Handler,MessageQueue和Looper四个部分组成。
     
        一. 先看Android中启动子线程的方法:
        例子:创建和启动子线程的三个方法,Android中多线程的写法和Java多线程写法基本上都是一样的。
     
    (1)布局文件内容:三个按钮,分别用于启动三个子线程
     1 <LinearLayout
     2     xmlns:android="http://schemas.android.com/apk/res/android"
     3     xmlns:tools="http://schemas.android.com/tools"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent"
     6     tools:context=".MainActivity"
     7     android:orientation="vertical" 
     8     >
     9     
    10     <Button 
    11         android:id="@+id/button01"
    12         android:layout_width="match_parent"
    13         android:layout_height="wrap_content"
    14         android:text="第一种方式启动子线程"
    15         />
    16     
    17     <Button 
    18         android:id="@+id/button02"
    19         android:layout_width="match_parent"
    20         android:layout_height="wrap_content"
    21         android:text="第二种方式启动子线程"
    22         />
    23     
    24     <Button 
    25         android:id="@+id/button03"
    26         android:layout_width="match_parent"
    27         android:layout_height="wrap_content"
    28         android:text="第三种方式启动子线程"
    29         />
    30     
    31 </LinearLayout>
    (2) MainActivity:先打印出主线程的ID,分别点击三个按钮,启动三个不同的子线程,在子线程分别打印出子线程的ID
     1 package zst.zst.thread01;
     2 import java.util.TreeMap;
     3 import android.os.Bundle;
     4 import android.app.Activity;
     5 import android.view.View;
     6 import android.view.View.OnClickListener;
     7 import android.widget.Button;
     8 public class MainActivity extends Activity implements OnClickListener{
     9     private Button button01;
    10     private Button button02;
    11     private Button button03;
    12     
    13     @Override
    14     protected void onCreate(Bundle savedInstanceState) {
    15         super.onCreate(savedInstanceState);
    16         setContentView(R.layout.activity_main);
    17         button01 = (Button)findViewById(R.id.button01);
    18         button02 = (Button)findViewById(R.id.button02);
    19         button03 = (Button)findViewById(R.id.button03);
    20         button01.setOnClickListener(this);
    21         button02.setOnClickListener(this);
    22         button03.setOnClickListener(this);
    23         
    24         //主线程ID
    25         System.out.println("主线程的ID-----> " + String.valueOf(Thread.currentThread().getId()));
    26     }
    27     @Override
    28     public void onClick(View v) {
    29             switch (v.getId()) {
    30             case R.id.button01:
    31                 //第一种启动子线程的方法
    32                 FirstThread firstThread = new FirstThread();
    33                 firstThread.start();
    34                 
    35                 break;
    36             case R.id.button02:
    37                 //第二种启动子线程的方法
    38                 SecondThread secondThread = new SecondThread();
    39                 new Thread(secondThread).start();
    40                 
    41                 break;
    42             case R.id.button03:
    43                 //第三种启动子线程的方法,和第二种方法是同一种启动方法,只不过这里用匿名内部类,这种方法最常见
    44                 new Thread(new Runnable() {
    45                     
    46                     @Override
    47                     public void run() {
    48                         System.out.println("第三个子线程的ID---> " + String.valueOf(Thread.currentThread().getId()));
    49                     }
    50                 }).start();
    51                 
    52                 break;
    53             default:
    54                 break;
    55             }
    56             
    57      }
    58     //第一种方法定义一个线程
    59     class FirstThread extends Thread{
    60         @Override
    61         public void run() {
    62             System.out.println("第一个子线程的ID---> " + String.valueOf(Thread.currentThread().getId()));
    63         }
    64         
    65         
    66     }
    67     
    68     //第二种方法定义一个线程
    69     class SecondThread implements Runnable{
    70         @Override
    71         public void run() {
    72             System.out.println("第二个子线程的ID---> " + String.valueOf(Thread.currentThread().getId()));
    73         }
    74         
    75     }
    76     
    77     
    78 }

    (3)

      输出:

     
     
     
        
     





  • 相关阅读:
    「Gym100025D」Automaton
    CF 紫色典题
    P8255 [NOI Online 2022 普及组] 数学游戏(民间数据) 题解
    numpy库 数据量太大出现Memory Error问题的解决方法汇总
    pycryptodome(Crypto) 安装
    六、容器Treeset排序
    5.Collections的sort方法进行排序
    四、冒泡+排序
    一、爬虫
    七、其他容器先进先出FIFO和后进先出LIFO
  • 原文地址:https://www.cnblogs.com/sanfeng4476/p/6093973.html
Copyright © 2020-2023  润新知