⑴ android 線程間通信有哪幾種方式
共享內存(變數);
第三方框架:EventBus ;
Handler/AsyncTask;
java 里的 wait(),notify(),notifyAll()
⑵ android子線程如何暫停和喚醒
在子線程中加looper,然後在主線程中向子線程中定義的handler發送消息,通知子線程wait()或者notify(),記得run中的代碼塊要放在synchronized中,說了大致的思路。
⑶ Android如何阻塞一個線程讓其等待一個時間發生之後再繼續執行
你所謂的線程阻塞是指的ui線程嗎?這應該是從你在開發的經驗以及測試當中去體驗的,如果你說是用代碼去判斷線程阻塞的話,估計比較復雜,也沒那個必要,android的機制在出現ui線程阻塞的話會出現anr給予用戶提示,出現這樣的情況是開發者在開發過程中就得去避免的!
⑷ android中怎麼讓線程長時間休眠線程休眠最長的安全時間是多少
設定一個Timer對象,時間到後觸發事件再給handler發消息處理就行,處理完重置timer的時間進入下一個循環即可。隨便用wait之類的土辦法的話很容易被系統判定為進程掛死然後被kill掉的。
⑸ Android設計問題
等待過程放進子線程(游標附件代碼),主線程不會阻塞,會立即繼續執行下面的Intent系列語句,然而此時upImage尚未完成,得不到具體的uri,所以會彈出選擇打開方式的這種情況。
可以改成如下方式:
兩個線程可以不變,但第二個線程wait返回後,post 一個消息到一個handler,handler在主線程中,執行Intent那部分的代碼,這樣能保證上傳完成後才執行Action view的intent,不會出現選擇打開方式。
⑹ Android怎麼正確使用wait和notify方法
synchronized(obj) {
while(!condition) {
obj.wait();
}
obj.doSomething();
}
當線程A獲得了obj鎖後,發現條件condition不滿足,無法繼續下一處理,於是線程A就wait() , 放棄對象鎖.
之後在另一線程B中,如果B更改了某些條件,使得線程A的condition條件滿足了,就可以喚醒線程A:
synchronized(obj) {
condition = true;
obj.notify();
}
需要注意的概念是:
# 調用obj的wait(), notify()方法前,必須獲得obj鎖,也就是必須寫在synchronized(obj) {…} 代碼段內。
# 調用obj.wait()後,線程A就釋放了obj的鎖,否則線程B無法獲得obj鎖,也就無法在synchronized(obj) {…} 代碼段內喚醒A。
# 當obj.wait()方法返回後,線程A需要再次獲得obj鎖,才能繼續執行。
# 如果A1,A2,A3都在obj.wait(),則B調用obj.notify()只能喚醒A1,A2,A3中的一個(具體哪一個由JVM決定)。
# obj.notifyAll()則能全部喚醒A1,A2,A3,但是要繼續執行obj.wait()的下一條語句,必須獲得obj鎖,因此,A1,A2,A3隻有一個有機會獲得鎖繼續執行,例如A1,其餘的需要等待A1釋放obj鎖之後才能繼續執行。
# 當B調用obj.notify/notifyAll的時候,B正持有obj鎖,因此,A1,A2,A3雖被喚醒,但是仍無法獲得obj鎖。直到B退出synchronized塊,釋放obj鎖後,A1,A2,A3中的一個才有機會獲得鎖繼續執行
⑺ android需要考慮結束線程嗎
Android終止線程的方法前提
線程對象屬於一次性消耗品,一般線程執行完run方法之後,線程就正常結束了,線程結束之後就報廢了,不能再次start,只能新建一個線程對象。但有時run方法是永遠不會結束的。
三種方法可以結束線程:
使用退出標志,使線程正常退出,也就是當run方法完成後線程終止。
使用interrupt()方法中斷線程。
使用stop方法強行終止線程(不推薦使用,可能發生不可預料的結果)。
使用退出標志終止線程
使用一個變數來控制循環,例如最直接的方法就是設一個boolean類型的標志,並通過設置這個標志為true或false來控制while循環是否退出。代碼如下:
使用stop方法終止線程
程序中可以直接使用thread.stop()來強行終止線程,但是stop方法是很危險的,就象突然關閉計算機電源,而不是按正常程序關機一樣,可能會產生不可預料的結果,不安全主要是:thread.stop()調用之後,創建子線程的線程就會拋出ThreadDeatherror的錯誤,並且會釋放子線程所持有的所有鎖。
其他注意事項:
前兩種方法都可以實現線程的正常退出,也就是要談的優雅結束線程,第3種方法相當於電腦斷電關機一樣,是不安全的方法。
⑻ android 強行關閉線程
這個好辦,這里有兩個線程吧,線程A
線程mSender。
設:讓線程A,監視線程mSender
第一步:
在A中定義一個變數:ExecutorService
transThread
=
Executors.newSingleThreadExecutor();
解釋:transThread
官方名稱是「單一線程池變數」,他是做什麼的呢,它就像我們給A的一塊賽車場,用來玩遙控賽車。
第二步:
在A中再定義一個變數:
Future
transPending;
解釋:transPending就像我給A一個用來控制遙控賽車的遙控器一樣
第三步:
在A中定義個線程mSender對象:
private
final
Runnable
mSender
=
new
Runnable()
{
public
void
run()
{
}};
解釋:這是你寫的對象,他就相當於我給A的一個遙控賽車。
第四步:
在A中添加如下語句:transPending
=
transThread.submit(mSender);
解釋:這一步就相當於把賽車(mSender)放入場地(第一步中我們定義的transThread),並且用遙控器「transPending」來控制他。
(註:這里你是否會有疑惑,我沒有寫"mSender.start()"之類的語句怎麼讓我的賽車跑起來啊(運行run()方法),放心,有了「transPending
=
transThread.submit(mSender);」這一步,賽車是自動跑起來的,也就是mSender會自動調用run的。)
第五步:
現在你可以用遙控器「transPending」干很多事情了
transPending.cancel(true);無論線程現在是否運行中,立刻終止。
transPending.cancel(false);當前線程若沒有運行(比如掛起狀態)就終止它。
transPending所做的不止這些。
⑼ android中新聲明了一個線程,如何對這個線程進行開始,暫停,再開始呢
class RunnableDemo implements Runnable {
public Thread t;
private String threadName;
boolean suspended = false;
RunnableDemo( String name){
threadName = name;
System.out.println("Creating " + threadName );
}
public void run() {
System.out.println("Running " + threadName );
try {
for(int i = 10; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
// Let the thread sleep for a while.
Thread.sleep(300);
synchronized(this) {
while(suspended) {
wait();
}
}
}
} catch (InterruptedException e) {
System.out.println("Thread " + threadName + " interrupted.");
}
System.out.println("Thread " + threadName + " exiting.");
}
public void start ()
{
System.out.println("Starting " + threadName );
if (t == null)
{
t = new Thread (this, threadName);
t.start ();
}
}
void suspend() {
suspended = true;
}
synchronized void resume() {
suspended = false;
notify();
}
}
start為開始,suspend為暫停,resume為恢復。
⑽ android java 線程 wait()函數
簡單說wait必須顯示用代碼喚醒。
wait是Object的方法,也就是說可以對任意一個對象調用wait方法,調用wait方法將會將調用者的線程掛起,直到其他線程調用同一個對象的notify方法才會重新激活調用者,例如:
//Thread 1
try{
obj.wait();//suspend thread until obj.notify() is called
}
catch(InterrputedException e) {
}