⑴ android中進程與線程及如何在子線程中操作U
一個Android 程序默認情況只有一個進程,但是一個進程可以有多個線程。其中有一個UI 線程也稱為UI主線程,UI Thread在Android程序運行的時候就被創建,主要是負責控制UI界面的顯示、更新和控制項交互。所有的Android應用程序組件----包括Activity、Service、Broadcast Receiver都在應用程序的主線程中運行。因此,任何組件中的費時操作處理都可能阻塞所有其他的組件、包括Service和可見的Activity。
在Android 中,對未響應的定義是:Activity對一個輸入事件在5s內沒有響應,或者Broadcast Receiver在10s內沒有完成他的onReceive處理程序。對於任何不用直接和用戶界面進行交互的重要處理,使用後台線程技術處理是非常重要的,將文件操作、網路交互、資料庫、復雜計算調度到後台線程中完成非常重要,以免阻塞主線程。
方法一:Thread+Handler
開啟一個新線程:new Thread(new MyThread()).start();
//通過Handler物件,通知主線程UI Thread來更新界面
Handler myHandler=new Handler(){
//此方法主要用於更新UI
public void handleMessage(Message msg){
switch(msg.what){
//根據Thread返回的標識進行相應的處理
}
}
};
class MyThread implements Runnable{
public void run(){
int what=0;
//將耗時操作放到這里處理
//to-do
⑵ android開發開想要在一個方法中將子線程計算的數據返回怎麼做
先實例化一個Handler再重寫handleMessage(Messagemsg)方法msg.getData().getXXX()獲得Thread線程發送的數據
⑶ Android 在子線程中更新UI的幾種方法示例
請您慢慢看:
直接在UI線程中開啟子線程來更新TextView顯示的內容,運行程序我們會發現,如下錯誤:android.view.ViewRoot$: Only the original thread that created a view hierarchy can touch its views.翻譯過來就是:只有創建這個控制項的線程才能去更新該控制項的內容。
所有的UI線程要去負責View的創建並且維護它,例如更新冒個TextView的顯示,都必須在主線程中去做,我們不能直接在UI線程中去創建子線程,要利用消息機制:handler,如下就是handler的簡單工作原理圖:
既然android給我們提供了Handler機制來解決這樣的問題,請看如下代碼:
public class HandlerTestActivity extends Activity { private TextView tv; private static final int UPDATE = 0; private Handler handler = new Handler() { @Overridepublic void handleMessage(Message msg) { // TODO 接收消息並且去更新UI線程上的控制項內容if (msg.what == UPDATE) { // Bundle b = msg.getData();// tv.setText(b.getString("num")); tv.setText(String.valueOf(msg.obj)); } super.handleMessage(msg); } }; /** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.tv); new Thread() { @Overridepublic void run() { // TODO 子線程中通過handler發送消息給handler接收,由handler去更新TextView的值try { for (int i = 0; i < 100; i++) { Thread.sleep(500); Message msg = new Message(); msg.what = UPDATE; // Bundle b = new Bundle();// b.putString("num", "更新後的值:" + i);// msg.setData(b); msg.obj = "更新後的值:" + i; handler.sendMessage(msg); } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); }}
我們就通過Handler機制來處理了子線程去更新UI線程式控制制項問題,Andrid開發中要經常用到這種機制。
⑷ Android 如何創建子線程以及區分主線程
在一個Android 程序開始運行的時候,會單獨啟動一個Process。默認的情況下,所有這個程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的兩種,除此之外還有Content Provider和Broadcast Receiver)都會跑在這個Process。
一個Android 程序默認情況下也只有一個Process,但一個Process下卻可以有許多個Thread。在這么多Thread當中,有一個Thread,我們稱之為UI Thread。UI Thread在Android程序運行的時候就被創建,是一個Process當中的主線程Main Thread,主要是負責控制UI界面的顯示、更新和控制項交互。在Android程序創建之初,一個Process呈現的是單線程模型,所有的任務都在一個線程中運行。因此,我們認為,UI Thread所執行的每一個函數,所花費的時間都應該是越短越好。而其他比較費時的工作(訪問網路,下載數據,查詢資料庫等),都應該交由子線程去執行,以免阻塞主線程。
那麼,UI Thread如何和其他Thread一起工作呢?常用方法是:
誕生一個主線程的Handler物件,當做Listener去讓子線程能將訊息Push到主線程的Message Quene里,以便觸發主線程的handlerMessage()函數,讓主線程知道子線程的狀態,並在主線程更新UI。
⑸ android應用程序開發,為串口接收數據創建的子線程問題,急!
找Bug應該要有條理,我們首先不能確定"每次都去執行while(value2 != 1)以外的代碼",因為程序執行的很快,可能收發很快,循環每妙執行多少次不確定,而且你的阻塞時間還是0,最好循環內外加上輸出判斷是不是每次都執行循環體外的代碼。
再就是你創建的是兩個循環,開頭
fd = HardwareControler.openSerialPort("/dev/ttyUSB0", buaterate, 8, 1);
每次讀取完數據都會給fd重新賦值, 不確定打開串口是否有應答數據,如果有的話
打開串口->應答數據->有數據,執行第二個循環->讀數據->重新第一個循環
這樣可能會一直有數據,可把fd = HardwareControler.openSerialPort("/dev/ttyUSB0", buaterate, 8, 1);放到第一個循環外面。
這些只是推測,需要你根據自己代碼慢慢調試。
⑹ android監聽方法是開啟一個子線程在執行
對於線程的控制,我們將介紹一個Handler類,使用該類可以對運行在不同線程中的多個任務進行排隊,並使用Message和Runnable對象安排這些任務。在javadoc中,對Handler是這樣解釋的:Handler可以發送和處理消息對象或Runnable對象,這些消息對象和Runnable對象與一個線程相關聯。每個Handler的實例都關聯了一個線程和線程的消息隊列。當創建了一個Handler對象時,一個線程或消息隊列同時也被創建,該Handler對象將發送和處理這些消息或Runnable對象。
⑺ android創建子線程
你是要怎麼個意思?
創建子線程即就是在你的程序體(也就是MainThread)中創建子線程:
1、匿名內部類對Thread類進行覆寫:new
Thread(){
覆寫run方法
}.start();
2、或者
new
Thread(new
Runnable(){········}).start();套用兩層匿名內部類也可以
3、再或者就是將當前類繼承Runnable然後在當前類里覆寫上run方法,最後在需要開線程的地方寫上new
Thread(this).start();
####別忘了在更新UI的時候跳回主線程就行了,用runOnUiThread
和handle機制都可以####
⑻ android中什麼是主線程什麼是子線程
一個app開始運行就會創建一個主線程,其他子線程都是在主線程中創建的。每個app都有一個主線程,但每個app並不一定有子線程。
⑼ android studio ndk 開發怎麼開一個子線程
建立項目,並設置activity.xml布局文件,這一點與普通編程沒有不同。通過一個簡單的文本展示實驗。
在MainActivity中添加native介面,並載入.so庫
生成項目的.class文件。首先選中項目後,在菜單欄選擇Build-->Make Project。
Make之後,將生成.class文件,生成的.class文件位於app_path/build/intermediates/classes/debug/包名
利用javah生成C頭文件:點擊"View->Tool Windows->Terminal",即在Studio中進行終端命令行工具。在控制台中通過命令「cd app\src\main\java」,進入到java目錄下。操作指令:javah -d ../jni vrlab.ndkdemoforandroidstudio.MainActivity。此時在main目錄下生成一個jni文件夾,其中在jni文件夾中有生成的.h頭文件。
編輯C文件,在jni文件夾下新建文件命名為main.c。並在該文件中導入需要的頭文件,實現上一步生成的頭文件中的方法。
配置NDK路徑,在local.properties中指明sdk和ndk路徑:
設置ndk參數,名字、發布平台等。在應用目錄下的build.gradle中defaultConfig中設置
生成.so文件,此時再次選擇Build-->Build Project就可以生成so文件了。出現不支持NDK的錯誤提示,不過跟著錯誤提示修改:在項目空間下的gradle.properties中添加android.useDeprecatedNdk=true。
針對三種不同的CPU生成了三種不同的.so文件。生成的.so文件位於app_path/build/intermediates/ndk/debug/lib.
安裝運行~~去吧,皮卡丘
⑽ android 子線程里開子線程嗎
可以啊,沒影響的,只要注意不要在線程更新ui就行了