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

歡迎訪問 生活随笔!

生活随笔

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

Android

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

發布時間:2024/4/15 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android---手动创建线程与GUI线程同步(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文在上一節Android---手動創建線程與GUI線程同步(一)的基礎上來進行改進

上一節我們實現了在子線程中進行耗時工作,并通過Handler更改GUI中的UI,但是我們并不能通過它來獲取后臺工作線程返回數據。這時可以通過對上一節的代碼進行改進。重寫Handler的handleMessage方法,具體代碼如下:

1>布局與上一節一致

代碼如下:

<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>MainActivity代碼如下:

package com.cxc.threadandhandler;import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView;public class MainActivity extends Activity {private static final String TAG = "com.cxc.threadandhandler.mainactivity";private TextView show_info_tv;private Button start_task_bt;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d(TAG, "---onCreate---");initViews();}private void initViews() {Log.d(TAG, "---initViews---");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);}OnClickListener myButtonClickListener = new 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---");BackgroundThread backgroundThread = new BackgroundThread();Thread myThread = new Thread(backgroundThread);myThread.start();break;default:break;}}};class BackgroundThread implements Runnable {private MyHandler mMyHander = null;private HandlerThread mhandlerThread = null;public BackgroundThread() {// TODO Auto-generated constructor stubmhandlerThread = new HandlerThread("handler_thread");mhandlerThread.start();mMyHander = new MyHandler(mhandlerThread.getLooper());}@Overridepublic void run() {// TODO Auto-generated method stubLog.d(TAG,"-----work thread ---"+Thread.currentThread().getId());backgroundThreadProcessing();}// 在后臺執行一些處理的方法---耗時操作private void backgroundThreadProcessing() {// to-do 耗時操作Log.d(TAG,"-----work thread -backgroundThreadProcessing ---"+Thread.currentThread().getId());for (int i = 0; i < 10; i++) {Bundle bundle = new Bundle();// 設置參數bundle.putString("info", "----后臺處理情況--" + i);Message msg = mMyHander.obtainMessage();msg.setData(bundle);msg.sendToTarget();Log.d(TAG, "***"+Thread.currentThread().currentThread().getId()+"-send:" + "----后臺處理情況--" + i);//myHandler.sendMessage(msg);try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}class MyHandler extends Handler {// 構造函數public MyHandler() {}public MyHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);// 接收“后臺”線程發送來的參數Bundle bundle = msg.getData();String str = bundle.getString("info");Log.d(TAG, "---"+Thread.currentThread().currentThread().getId()+"-receive:" + str);// 在這里不能設置TextView 的值,因為此時Handler沒有運行在GUI線程中//show_info_tv.setText(str);}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);} }

2.3>Log如下:


06-04 16:17:27.694 18409-18409/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---onCreate--- 06-04 16:17:27.694 18409-18409/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---initViews--- 06-04 16:17:30.239 18409-18409/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---Start Task Button Click--- 06-04 16:17:30.249 18409-18664/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ -----work thread ---14937 06-04 16:17:30.254 18409-18664/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ -----work thread -backgroundThreadProcessing ---14937 06-04 16:17:30.254 18409-18664/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ***14937-send:----后臺處理情況--0 06-04 16:17:30.254 18409-18661/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---14936-receive:----后臺處理情況--0 06-04 16:17:30.254 18409-18664/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ***14937-send:----后臺處理情況--1 06-04 16:17:30.254 18409-18661/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---14936-receive:----后臺處理情況--1 06-04 16:17:30.254 18409-18664/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ***14937-send:----后臺處理情況--2 06-04 16:17:30.254 18409-18661/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---14936-receive:----后臺處理情況--2 06-04 16:17:30.254 18409-18664/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ***14937-send:----后臺處理情況--3 06-04 16:17:30.254 18409-18661/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---14936-receive:----后臺處理情況--3 06-04 16:17:30.254 18409-18664/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ***14937-send:----后臺處理情況--4 06-04 16:17:30.254 18409-18661/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---14936-receive:----后臺處理情況--4 06-04 16:17:30.259 18409-18664/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ***14937-send:----后臺處理情況--5 06-04 16:17:30.259 18409-18661/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---14936-receive:----后臺處理情況--5 06-04 16:17:30.259 18409-18664/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ***14937-send:----后臺處理情況--6 06-04 16:17:30.259 18409-18661/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---14936-receive:----后臺處理情況--6 06-04 16:17:30.259 18409-18664/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ***14937-send:----后臺處理情況--7 06-04 16:17:30.259 18409-18661/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---14936-receive:----后臺處理情況--7 06-04 16:17:30.259 18409-18661/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---14936-receive:----后臺處理情況--8 06-04 16:17:30.259 18409-18664/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ***14937-send:----后臺處理情況--8 06-04 16:17:30.259 18409-18664/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ***14937-send:----后臺處理情況--9 06-04 16:17:30.259 18409-18661/com.demo.cxc.threadhandlerdemo D/MainActivity﹕ ---14936-receive:----后臺處理情況--9
從Log日志來看,mMyHandler確定沒有運行在GUI線程中,所以也就不能在使用更改UI了。

這里需要注意,這里用到的多線程并非由Runnable對象開啟的,而是ThreadHandler對象開啟的。Runnable對象只是作為一個封裝了操作的對象被傳遞,并未產生新線程。

總結

以上是生活随笔為你收集整理的Android---手动创建线程与GUI线程同步(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

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