android ——多線程編程

來源:互聯網
上載者:User

標籤:手機   設定   undle   bsp   state   view   out   線程中更新ui   ext   

  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     <TextView13         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             @Override14             public void onClick(View view) {15                 16                 //開啟一個子線程17                 new Thread(new Runnable() {18                     @Override19                     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     @Override20     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             @Override31             public void onClick(View view) {32 33                 //開啟一個子線程34                 new Thread(new Runnable() {35                     @Override36                     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()方法發送出去。

  

 

android ——多線程編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.