日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android---手动创建线程与GUI线程同步(一)

發布時間:2024/4/15 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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线程同步(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。