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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

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

Android---手動(dòng)創(chuàng)建線程與GUI線程同步的第三種方法:

在GUI線程中調(diào)用runOnUiThread(Runnable runnable), 此時(shí)work Thread與GUI線程在同一個(gè)線程中, 所以,可以直接在work thread中更改GUI中的UI(此方法比較簡單,適合work thread執(zhí)行的任務(wù)比較簡單,不耗進(jìn)的任務(wù)。特別注意:當(dāng)work thread 執(zhí)行比較耗時(shí)的任務(wù)時(shí),使用此方法會(huì)阻塞GUI線程,因?yàn)閣ork thread 實(shí)際上也是在GUI線程中運(yùn)行的)

1>布局與上二節(jié)都一樣

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="work thread運(yùn)行在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="顯示后臺(tái)任務(wù)情況" /><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, "---main---" + Thread.currentThread().getId());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// 將耗時(shí)的操作移到子線程中Log.d(TAG, "---Start Task Button Click---");BackgroundThread backgroundThread = new BackgroundThread();runOnUiThread(backgroundThread);break;default:break;}}};class BackgroundThread implements Runnable {public BackgroundThread() {// TODO Auto-generated constructor stub}@Overridepublic void run() {// TODO Auto-generated method stubLog.d(TAG, "-----work thread ---" + Thread.currentThread().getId());backgroundThreadProcessing();}// 在后臺(tái)執(zhí)行一些處理的方法---耗時(shí)操作private void backgroundThreadProcessing() {// to-do 耗時(shí)操作Log.d(TAG, "-----work thread -backgroundThreadProcessing ---"+ Thread.currentThread().getId());for (int i = 0; i < 10; i++) {String text = show_info_tv.getText().toString();/** 在GUI線程中調(diào)用runOnUiThread(Runnable runnable); 此時(shí)work Thread* 與GUI線程在同一個(gè)線程中, 所以,可以直接在work thread中更改GUI中的UI*/text +=("*"+i);show_info_tv.setText(text );Log.d(TAG,"----:"+text);}}}@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);} }

運(yùn)行效果如下:



2.3>Log日志

06-01 20:42:26.879: D/com.cxc.threadandhandler.mainactivity(13839): ---main---1 06-01 20:42:26.879: D/com.cxc.threadandhandler.mainactivity(13839): ---onCreate--- 06-01 20:42:26.879: D/com.cxc.threadandhandler.mainactivity(13839): ---initViews--- 06-01 20:42:33.499: D/com.cxc.threadandhandler.mainactivity(13839): ---Start Task Button Click--- 06-01 20:42:33.499: D/com.cxc.threadandhandler.mainactivity(13839): -----work thread ---1 06-01 20:42:33.499: D/com.cxc.threadandhandler.mainactivity(13839): -----work thread -backgroundThreadProcessing ---1 06-01 20:42:33.499: D/com.cxc.threadandhandler.mainactivity(13839): ----:顯示后臺(tái)任務(wù)情況*0 06-01 20:42:33.499: D/com.cxc.threadandhandler.mainactivity(13839): ----:顯示后臺(tái)任務(wù)情況*0*1 06-01 20:42:33.499: D/com.cxc.threadandhandler.mainactivity(13839): ----:顯示后臺(tái)任務(wù)情況*0*1*2 06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:顯示后臺(tái)任務(wù)情況*0*1*2*3 06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:顯示后臺(tái)任務(wù)情況*0*1*2*3*4 06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:顯示后臺(tái)任務(wù)情況*0*1*2*3*4*5 06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:顯示后臺(tái)任務(wù)情況*0*1*2*3*4*5*6 06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:顯示后臺(tái)任務(wù)情況*0*1*2*3*4*5*6*7 06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:顯示后臺(tái)任務(wù)情況*0*1*2*3*4*5*6*7*8 06-01 20:42:33.504: D/com.cxc.threadandhandler.mainactivity(13839): ----:顯示后臺(tái)任務(wù)情況*0*1*2*3*4*5*6*7*8*9
3>分析從上面的Log可以看出work thread 確實(shí)運(yùn)行在GUI線程中,所以可以直接在work thread 中直接更改GUI中的 UI控件,而不會(huì)引起"
?android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views."異常

4>總結(jié)對于比較耗時(shí)的操作應(yīng)該放到work thread 中運(yùn)行,此時(shí)可以使用方法(二)來實(shí)現(xiàn)

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。