Android---手动创建线程与GUI线程同步(一)
生活随笔
收集整理的這篇文章主要介紹了
Android---手动创建线程与GUI线程同步(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
雖然使用Intent Service 和創建AsyncTasks是非常有用的捷徑,但還是有一些需要創建和管理自己的線程來執行后臺處理的場景。通常的情況就是存在長時間運行或者相互聯系的線程,它們需要一些比目前兩種技術描述的更加微秒或者復雜的管理操作。
這里我們將介紹如何創建和啟動新的Thread對象,以及如何在更新UI前與GUI線程同步。
可以使用Android的Handler類與java.lang.Thread中提供的線程類創建和管理子線程。
代碼清單如下:
1>布局如下
1.1>效果
1.2>代碼如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.cxc.threadandhandler.MainActivity" ><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Thread用于耗時任務 + Handler用于GUI同步" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:id="@+id/show_info_tv"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="顯示后臺任務情況" /><Buttonandroid:id="@+id/start_task_bt"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Start Task" /></LinearLayout></LinearLayout>
2>代碼如下
2.1>詳細代碼如下:
package com.demo.cxc.threadhandlerdemo;import android.os.Handler; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView;public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";private TextView show_info_tv;private Button start_task_bt;/*//在主線程上初始化一個handler//每個Handler實例,都會綁定到創建他的線程中(一般是位于主線程)//Handler對象初始化后,就默認與對它初始化的進程的消息隊列綁定//在這里myHandler與GUI線程(主線程)的消息隊列綁定*/private Handler myHandler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d(TAG, "---onCreate---Thread id:" + Thread.currentThread().getId());initViews();}private void initViews() {Log.d(TAG, "---initViews---thread id:" + Thread.currentThread().getId());show_info_tv = (TextView) findViewById(R.id.show_info_tv);start_task_bt = (Button) findViewById(R.id.start_task_bt);start_task_bt.setOnClickListener(myButtonClickListener);}View.OnClickListener myButtonClickListener = new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.start_task_bt:// to-do// 將耗時的操作移到子線程中Log.d(TAG, "---Start Task Button Click---");Thread myThread = new Thread(null,doBackgroundThreadProcessingRunnable, "background");myThread.start();break;default:break;}}};// 執行后臺處理方法的Runnableprivate Runnable doBackgroundThreadProcessingRunnable = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubLog.d(TAG, "---doBackgroundThreadProcessingRunnable run---thread id :" + Thread.currentThread().getId());backgroundThreadProcessing();}};// 在后臺執行一些處理的方法---耗時操作private void backgroundThreadProcessing() {// to-do 耗時操作for (int i = 0; i < 10; i++) {Log.d(TAG, "*****thread id :" + Thread.currentThread().getId() + "---backgroundThreadProcessing---i:" + i);// 當前線程休眠1000mstry {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 在UI主線程上使用Handler發布doUpdateGUI Runnable/** doUpdateGUIRunnable對象并沒有新建一個單獨的線程,* 而是運行在myHandler所在的線程中,* 在這里就是GUI線程中* */myHandler.post(doUpdateGUIRunnable);}}// 執行updateGUI方法的Runnableprivate Runnable doUpdateGUIRunnable = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubLog.d(TAG, "++++++doUpdateGUIRunnable run---thread id :" + Thread.currentThread().getId());updateGUI();}};// 這個方法必須由UI線程調用private void updateGUI() {// to-do 更新UIshow_info_tv.setText(show_info_tv.getText().toString() + "¥¥");}}2.2>運行效果:
2.3> Log輸出如下:
06-04 15:52:12.949 27514-27514/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---onCreate---Thread id:1 06-04 15:52:12.949 27514-27514/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---initViews---thread id:1 06-04 15:52:19.829 27514-27514/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---Start Task Button Click--- 06-04 15:52:19.829 27514-28040/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---doBackgroundThreadProcessingRunnable run---thread id :14444 06-04 15:52:19.829 27514-28040/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ *****thread id :14444---backgroundThreadProcessing---i:0 06-04 15:52:20.829 27514-28040/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ *****thread id :14444---backgroundThreadProcessing---i:1 06-04 15:52:20.829 27514-27514/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ++++++doUpdateGUIRunnable run---thread id :1 06-04 15:52:21.829 27514-28040/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ *****thread id :14444---backgroundThreadProcessing---i:2 06-04 15:52:21.829 27514-27514/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ++++++doUpdateGUIRunnable run---thread id :1 06-04 15:52:22.834 27514-28040/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ *****thread id :14444---backgroundThreadProcessing---i:3 06-04 15:52:22.834 27514-27514/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ++++++doUpdateGUIRunnable run---thread id :1 06-04 15:52:23.829 27514-28040/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ *****thread id :14444---backgroundThreadProcessing---i:4 06-04 15:52:23.829 27514-27514/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ++++++doUpdateGUIRunnable run---thread id :1 06-04 15:52:24.829 27514-28040/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ *****thread id :14444---backgroundThreadProcessing---i:5 06-04 15:52:24.829 27514-27514/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ++++++doUpdateGUIRunnable run---thread id :1 06-04 15:52:25.829 27514-28040/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ *****thread id :14444---backgroundThreadProcessing---i:6 06-04 15:52:25.834 27514-27514/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ++++++doUpdateGUIRunnable run---thread id :1 06-04 15:52:26.834 27514-28040/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ *****thread id :14444---backgroundThreadProcessing---i:7 06-04 15:52:26.834 27514-27514/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ++++++doUpdateGUIRunnable run---thread id :1 06-04 15:52:27.834 27514-28040/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ *****thread id :14444---backgroundThreadProcessing---i:8 06-04 15:52:27.839 27514-27514/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ++++++doUpdateGUIRunnable run---thread id :1 06-04 15:52:28.834 27514-28040/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ *****thread id :14444---backgroundThreadProcessing---i:9 06-04 15:52:28.834 27514-27514/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ++++++doUpdateGUIRunnable run---thread id :1 06-04 15:52:29.839 27514-27514/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ++++++doUpdateGUIRunnable run---thread id :1從以上Log 可以看出,doUpdateGUIRunnable確定是運行在GUI線程中,即myHandler.post(doUpdateGUIRunnable)會使doUpdateGUIRunable對象運行在創建myHandler的線程中,在這里也就是GUI線程中了。
總結
以上是生活随笔為你收集整理的Android---手动创建线程与GUI线程同步(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android AsyncTask用法介
- 下一篇: Android---手动创建线程与GUI