A. android開發中如何使用多線程
handler其實就是消息處理機制。首先在主線程也就是UI創建一個Handler對象,復寫其中的handMessage( Message msg)方法。該方法里的msg就是子線程發來的消息,表示子線程處理完了,以這個msg來通知主線程。讓主線程來作UI的繪制工作。
那麼子線程工作完了就要發消息了,比如:
run(){
data = getDataFromInternet();//耗時工作
Message msg = handler.obtainMessage(0, data);//通過handler得到消息,該消息的標識為0,消息內容是data
handler.sendMessage(msg);//發送
}
然後handler在主線程就負責接收:
public Handler handler = new Handler(){//處理UI繪制
@SuppressWarnings("unchecked")
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
data = (List<Map<String, Object>>) msg.obj;
if(data == null){
Toast.makeText(AllMovieActivity.this, "網路連接失敗,獲取不到影片信息", 1).show();
}else {
adapter = new HotMoviedapter(AllMovieActivity.this, data, R.layout.allmovielist_item,
new String[] { "picurl", "chname", "director", "leadrole",
"fshowtime", "country" }, new int[] { R.id.picurl,
R.id.chname, R.id.director, R.id.leadrole,
R.id.fshowtime, R.id.country },mListView);
TextView v = new TextView(AllMovieActivity.this);
v.setHeight(80);
v.setSelectAllOnFocus(false);
mListView.addFooterView(v);
mListView.setAdapter(adapter);
}
break;
default:
break;
}
}
};
B. Android studio線程
第一步,你先獲取進度條對象
java">ProgressBarpb=newProgressBar(getApplicationContext());//動態創建
//ProgressBarpb=findViewById(R.id.pb);//靜態獲取
第二步,你得先創建一個子線程,子線程直接設置進度條
Threadthread=newThread(newRunnable(){
@Override
publicvoidrun(){
for(inti=0;i<100;i++){
finalintfinalI=i;
pb.setProgress(i);
}
}
});
第三步,你得建立與main主線程的通信,兩種方式選其一,我選個最簡單的,使用系統提供的runOnUiThread函數,傳遞你第一步創建的子線程,作為參數即可
runOnUiThread(thread);
大功告成!
——
還有一種handler的方法,你需要可以提~
C. 簡述android多線程機制
Handler對象與其調用者在同一線程中,如果在Handler中設置了延時操作,則調用線程也會堵塞。每個Handler對象都會綁定一個Looper對象,每個Looper對象對應一個消息隊列(MessageQueue)。如果在創建Handler時不指定與其綁定的Looper對象,系統默認會將當前線程的Looper綁定到該Handler上。在主線程中,可以直接使用newHandler()創建Handler對象,其將自動與主線程的Looper對象綁定;在非主線程中直接這樣創建Handler則會報錯,因為Android系統默認情況下非主線程中沒有開啟Looper,而Handler對象必須綁定Looper對象。這種情況下,需先在該線程中手動開啟Looper(Looper.prepare()-->Looper.loop()),然後將其綁定到Handler對象上;或者通過Looper.getMainLooper(),獲得主線程的Looper,將其綁定到此Handler對象上。Handler發送的消息都會加入到Looper的MessageQueue中。一說Handler包含兩個隊列:線程隊列和消息隊列;使用Handler.post()可以將線程對象加入到線程隊列中;使用Handler.sendMessage()可以將消息對象加入到消息隊列中。通過源碼分析證實,Handler只有一個消息隊列,即MessageQueue。通過post()傳進去的線程對象將會被封裝成消息對象後傳入MessageQueue。使用post()將線程對象放到消息隊列中後,當Looper輪詢到該線程執行時,實際上並不會單獨開啟一個新線程,而仍然在當前Looper綁定的線程中執行,Handler只是調用了該線程對象的run()而已。如,在子線程中定義了更新UI的指令,若直接開啟將該線程執行,則會報錯;而通過post()將其加入到主線程的Looper中並執行,就可以實現UI的更新。使用sendMessage()將消息對象加入到消息隊列後,當Looper輪詢到該消息時,就會調用Handler的handleMessage()來對其進行處理。再以更新UI為例,使用這種方法的話,就先將主線程的Looper綁定在Handler對象上,重載handleMessage()來處理UI更新,然後向其發送消息就可以了。
D. android 線程
Android分為兩個線程。一個是主線程(更新ui用的),一個是工作線程(非同步耗時操作用的)
E. android線程有幾種
在開發工程中線程可以幫助我們提高運行速度,Android開發中我知道的線程有四個一個是老生長談的Thread,第二個是asyncTask,第三個:TimetTask,第四個是Looper.
F. android需要考慮結束線程嗎
Android終止線程的方法前提
線程對象屬於一次性消耗品,一般線程執行完run方法之後,線程就正常結束了,線程結束之後就報廢了,不能再次start,只能新建一個線程對象。但有時run方法是永遠不會結束的。
三種方法可以結束線程:
使用退出標志,使線程正常退出,也就是當run方法完成後線程終止。
使用interrupt()方法中斷線程。
使用stop方法強行終止線程(不推薦使用,可能發生不可預料的結果)。
使用退出標志終止線程
使用一個變數來控制循環,例如最直接的方法就是設一個boolean類型的標志,並通過設置這個標志為true或false來控制while循環是否退出。代碼如下:
使用stop方法終止線程
程序中可以直接使用thread.stop()來強行終止線程,但是stop方法是很危險的,就象突然關閉計算機電源,而不是按正常程序關機一樣,可能會產生不可預料的結果,不安全主要是:thread.stop()調用之後,創建子線程的線程就會拋出ThreadDeatherror的錯誤,並且會釋放子線程所持有的所有鎖。
其他注意事項:
前兩種方法都可以實現線程的正常退出,也就是要談的優雅結束線程,第3種方法相當於電腦斷電關機一樣,是不安全的方法。
G. Android如何阻塞一個線程讓其等待一個時間發生之後再繼續執行
你所謂的線程阻塞是指的ui線程嗎?這應該是從你在開發的經驗以及測試當中去體驗的,如果你說是用代碼去判斷線程阻塞的話,估計比較復雜,也沒那個必要,android的機制在出現ui線程阻塞的話會出現anr給予用戶提示,出現這樣的情況是開發者在開發過程中就得去避免的!
H. Android 中如何停止一個線程
有三種方法可以結束線程:
1. 使用退出標志,使線程正常退出,也就是當run方法完成後線程終止
2. 使用interrupt()方法中斷線程
3. 使用stop方法強行終止線程(不推薦使用,可能發生不可預料的結果)
前兩種方法都可以實現線程的正常退出,也就是要談的優雅結束線程;第3種方法相當於電腦斷電關機一樣,是不安全的方法。
I. Android開發中為什麼要用到線程
在線程中如果想對UI進行操作需要用 Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: break; default: break; } } }; 在線程中用handler.sendEmptyMessage(0);進行UI的操作,你最好貼一下報錯信息,不然無法確定是不是這個原因
J. 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所做的不止這些。