❶ android中的子線程可以先執行完再執行主線程嗎
你開啟子線程後 主線程不動 等子線程結束了再操作主線程不就好了?
❷ android 子線程中定義的Arrylist如何通過Handler傳遞到主線程中
我們開發應用程序的時候,處於線程安全的原因子線程通常是不能直接更新主線程(UI線程)中的UI元素的,那麼在Android開發中有幾種方法解決這個問題,其中方法之一就是利用Handler處理的。
在Java中創建多線程的方法有兩種:
通過繼承Thread類,重寫Run方法來實現
通過繼承介面Runnable實現多線程
Handler是這么定義的:
主要接受子線程發送的數據, 並用此數據配合主線程更新UI.
Handler的主要作用:主要用於非同步消息的處理
Handler的運行過程:
當(子線程)發出一個消息之後,首先進入一個(主線程的)消息隊列,發送消息的函數即刻返回,而在主線程中的Handler逐個的在消息隊列中將消息取出,然後對消息進行處理。這樣就實現了跨線程的UI更新(實際上還是在主線程中完成的)。
這種機制通常用來處理相對耗時比較長的操作,如訪問網路比較耗時的操作,讀取文大文件,比較耗時的操作處理等。
啟動應用時Android開啟一個主線程 (也就是UI線程) , 如果此時需要一個耗時的操作,例如: 聯網讀取數據,或者讀取本地較大的一個文件的時候,你不能把這些操作放在主線程中,如果你放在主線程中的話,界面會出現假死現象(這也就是你在主線程中直接訪問網路時會提示你異常的原因,如我們上篇文章所述Android主線程不能訪問網路異常解決辦法
)。
這個時候我們需要把這些耗時的操作,放在一個子線程中,因為子線程涉及到UI更新,Android主線程是線程不安全的,更新UI只能在主線程中更新.。
這個時候,Handler就出現了,來解決這個復雜的問題,由於Handler運行在主線程中(UI線程中), 它與子線程可以通過Message對象來傳遞數據, 這個時候,Handler就承擔著接受子線程傳過來的(子線程用sedMessage()方法傳弟)Message對象,(裡麵包含數據) , 把這些消息放入主線程隊列中,配合主線程進行更新UI。
Handler對象的一些主要方法,如下:
post(Runnable) postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
正如方法名字中看到的,有兩類方法:
(1)在某個主線程中執行Runnable
(2)在子線程中發送一個消息,在主線程中檢測該消息處理
線程間傳遞Message對象的sendMessage方法和發送Runnable多線程對象的post方法。正對應著上面所說的兩個特性1)、2)
❸ android里如何在子線程中如何更新主線程的控制項
步驟:
1、創建Handler對象(此處創建於主線程中便於更新UI)。
2、構建Runnable對象,在Runnable中更新界面。
3、在子線程的run方法中向UI線程post,runnable對象來更新UI。
代碼
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button button;
private TextView textview;
private final int SPLASH_DISPLAY_LENGHT = 1;
private static int flag = 0;
private static int count=0;
private int ab=1;
private boolean isrun = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button1);
textview = (TextView)findViewById(R.id.textView1);
final Handler handler= new Handler();
final Runnable runnable = new Runnable() {
public void run() {
textview.setText(Integer.toString(ab));
}
};
final Thread t = new Thread(){
//public boolean isrun=true;
@Override
public void run() {
while(isrun)
{
handler.post(runnable); //加入到消息隊列 這樣沒有啟動新的線程,雖然沒有報異常。但仍然阻塞ProgressDialog的顯示
ab++;
try {
sleep(1000); //直接調用
} catch (InterruptedException e) {
return;
}
}
}
};
t.start();
button.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View view)
{
isrun=false;
}
});
}
}
❹ Android 傳遞參數給子線程
假設a方法為 void a(String uri), 按你說的,你應該已經在A類中創建B對象objB, 也已經獲得了uri,那麼直接用objB.a(url)不可以么?另外你這個子線程是放在A還是B中?
❺ android如何終止一個正在運行的子線程
線程像這樣:
Thread{
boolean flag = fase;
run(){
while(!flag){
}
}
}
Thread t = new Thread();
t.start();
-----------------------------------------------------
要終止循環,只需要這樣
t.flag=true;
================================================
還有一種方式 線程像這樣:
Thread{
run(){
while(true){
Thread.sleep(xxxx);
}
}
}
Thread t = new Thread();
t.start();
--------------------------------------------
要終止循環,只需要這樣
t.interrupte();
但是這里要注意調用的時機,要在子線程執行了run方法裡面的sleep(xxxx)後xxxx時間之內調用。也就是子線程會睡一會,醒一會,睡一會,醒一會,要在子線程睡著的時候調用。
❻ Android創建子線程和回調主線程的幾種方式
主線程吧
我記得像是xuitls
的連網回調函數。在onsuccess
和
onfailure
方法裡面,可以直接關閉彈出的聯網進度條
既然可以修改控制項,應該就是在主線程了吧
❼ android子線程如何暫停和喚醒
在子線程中加looper,然後在主線程中向子線程中定義的handler發送消息,通知子線程wait()或者notify(),記得run中的代碼塊要放在synchronized中,說了大致的思路。
❽ Android:主線程如何向子線程發送消息
因為你是在主線程創建的handler實例,比如你是這樣實例化handler
然後調用looper.loop();就開始了消息循環。這就是為什麼在主線程發消息住線程還能收到消息的原因。因為發送消息的實例是在主線程實例化的就有了主線程的looper。
❾ android 主線程和子線程有什麼區別
本文較為深入的分析了android中UI主線程與子線程。分享給大家供大家參考。具體如下:
在一個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。
例如,在子線程的狀態發生變化時,我們需要更新UI。如果在子線程中直接更新UI,通常會拋出下面的異常:
11-07 13:33:04.393: ERROR/JavaBinder(1029):android.view.ViewRoot$:Only the original thread that created a view hierarchy can touch its views.
意思是,無法在子線程中更新UI。為此,我們需要通過Handler物件,通知主線程Ui Thread來更新界面。
如下,首先創建一個Handler,來監聽Message的事件:
private final int UPDATE_UI = 1;
private Handler mHandler = new MainHandler();
private class MainHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_UI: {
Log.i("TTSDeamon", "UPDATE_UI");
showTextView.setText(editText.getText().toString());
ShowAnimation();
break;
}
default:
break;
}
}
}
或者:
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_UI: {
Log.i("TTSDeamon", "UPDATE_UI");
showTextView.setText(editText.getText().toString());
ShowAnimation();
break;
}
default:
break;
}
}
}
當子線程的狀態發生變化,則在子線程中發出Message,通知更新UI。
mHandler.sendEmptyMessageDelayed(UPDATE_UI, 0);
在我們的程序中,很多Callback方法有時候並不是運行在主線程當中的,所以如果在Callback方法中更新UI失敗,也可以採用上面的方法。