當前位置:首頁 » 安卓系統 » android多線程處理

android多線程處理

發布時間: 2022-07-05 09:13:12

⑴ 簡述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更新,然後向其發送消息就可以了。

⑵ Android 多線程與Java多線程比較 有哪些區別

在一個程序中,這些獨立運行的程序片斷叫作「線程」(Thread),利用它編程的概念就叫作「多線程處理」。多線程處理一個常見的例子就是用戶界面。利用線程,用戶可按下一個按鈕,然後程序會立即作出響應,而不是讓用戶等待程序完成了當前任務以後才開始響應。簡單地說,就是說可以有多個任務同時進行。
單線程在程序執行時,所走的程序路徑按照連續順序排下來,前面的必須處理好,後面的才會執行。因此,針對前面舉的例子,必須等待程序完成了當前任務以後才能開始相應。

使用多線程訪問公共的資源時,容易引發線程安全性問題,因此針對這種需要使用線程同步機制來保護公共的資源。
單線程較多線程來說,就不會出現上訴問題,系統穩定、擴展性極強、軟體豐富。多用於點對點的服務。

⑶ android怎麼調試多線程,Log大法嗎,太苦逼了吧

1.arm-eabi-addr2line 類似libxxx.so 0x00012345調用棧16進制值翻譯文件名函數名
arm-eabi-addr2line -e libxxx.so 0x00012345
2.arm-eabi-nm 列文件符號信息
arm-eabi-nm -l -C -n -S libdvm.so > dvm.data
3.arm-eabi-objmp 列文件詳細信息
arm-eabi-objmp -C -d libc.so > libc.s
通工具析 我較完整調用棧及調用邏輯匯編碼
需要結合ARM架構及ARM匯編知識(些情況能需要使用gdb)
析現tombstone原本遇些tombstone情況:
1.效函數指針:指針NULL或者已經重新賦值
2.strlen崩潰:導致完全棧信息棧破壞
3.FILE操作:stdio並非線程安全線程操作容易現異
-

⑷ android多線程

這個線程就是每次增加圖片的alpha值來實現圖片慢慢顯示的,因為程序要在onCreat完成之後才顯示,你如果在oncreat里邊跑那個循環,那麼onCreat方法事實上一直沒完成,所以一直顯示黑色。要想去掉線程外殼,可以試試在觸發事件里執行

⑸ 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開發中如何使用多線程

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;
}
}
};

⑺ android 多線程裡面有什麼優化的

一:為什麼不能在onCreate中使用open_file.handler.post(this)你在onCreate方法中調用open_file.handler.post(this),意味著你把耗時的任務(publicvoidrun()中的工作)又扔給了主線程的消息隊列,當主線程處理這個消息時,豈不是被阻塞了?所以,你應該在onCreate中使用t=newThread(this);t.start();二、為什麼不能更新視圖((open_file)open_file.open_file1).initData_1(file_all);//刷新主線程視圖這里應該這樣寫:@Overridepublicvoidrun(){file_all=open_ok.OK_All(Constant.SD);open_file.handler.post(newRunnable(){publicvoidrun()//這里run的操作將扔回主線程消息隊列{((open_file)open_file.open_file1).initData_1(file_all);//不可以耗時很長哦}});}由於你的代碼不完整,我給的代碼也可能需要修改。總之思路就是這個樣子。

⑻ android多核,多線程該如何用

在程序開發的實踐當中,為了讓程序表現得更加流暢,我們肯定會需要使用到多線程來提升程序的並發執行性能。但是編寫多線程並發的代碼一直以來都是一個相對棘手的問題,所以想要獲得更佳的程序性能,我們非常有必要掌握多線程並發編程的基礎技能。
眾所周知,Android 程序的大多數代碼操作都必須執行在主線程,例如系統事件(例如設備屏幕發生旋轉),輸入事件(例如用戶點擊滑動等),程序回調服務,UI 繪制以及鬧鍾事件等等。那麼我們在上述事件或者方法中插入的代碼也將執行在主線程。

一旦我們在主線程裡面添加了操作復雜的代碼,這些代碼就很可能阻礙主線程去響應點擊/滑動事件,阻礙主線程的 UI 繪制等等。我們知道,為了讓屏幕的刷新幀率達到 60fps,我們需要確保 16ms 內完成單次刷新的操作。一旦我們在主線程裡面執行的任務過於繁重就可能導致接收到刷新信號的時候因為資源被佔用而無法完成這次刷新操作,這樣就會產生掉幀的現象,刷新幀率自然也就跟著下降了(一旦刷新幀率降到 20fps 左右,用戶就可以明顯感知到卡頓不流暢了)。

為了避免上面提到的掉幀問題,我們需要使用多線程的技術方案,把那些操作復雜的任務移動到其他線程當中執行,這樣就不容易阻塞主線程的操作,也就減小了出現掉幀的可能性。

那麼問題來了,為主線程減輕負的多線程方案有哪些呢?這些方案分別適合在什麼場景下使用?Android 系統為我們提供了若干組工具類來幫助解決這個問題。
AsyncTask: 為 UI 線程與工作線程之間進行快速的切換提供一種簡單便捷的機制。適用於當下立即需要啟動,但是非同步執行的生命周期短暫的使用場景。
HandlerThread: 為某些回調方法或者等待某些任務的執行設置一個專屬的線程,並提供線程任務的調度機制。
ThreadPool: 把任務分解成不同的單元,分發到各個不同的線程上,進行同時並發處理。
IntentService: 適合於執行由 UI 觸發的後台 Service 任務,並可以把後台任務執行的情況通過一定的機制反饋給 UI。
了解這些系統提供的多線程工具類分別適合在什麼場景下,可以幫助我們選擇合適的解決方案,避免出現不可預期的麻煩。雖然使用多線程可以提高程序的並發量,但是我們需要特別注意因為引入多線程而可能伴隨而來的內存問題。舉個例子,在 Activity 內部定義的一個 AsyncTask,它屬於一個內部類,該類本身和外面的 Activity 是有引用關系的,如果 Activity 要銷毀的時候,AsyncTask 還仍然在運行,這會導致 Activity 沒有辦法完全釋放,從而引發內存泄漏。所以說,多線程是提升程序性能的有效手段之一,但是使用多線程卻需要十分謹慎小心,如果不了解背後的執行機制以及使用的注意事項,很可能引起嚴重的問題。

⑼ android 多線程怎麼處理

1)進程和線程的概念;
2)Java中的線程,在Java中創建線程的方式;
3)Android中的線程,包括:Message、Handler、Looper和HandlerThread等概念。

⑽ 淺談Android中多線程切換的幾種方法

Java提供了線程類Thread來創建多線程的程序。其實,創建線程與創建普通的類的對象的操作是一樣的,而線程就是Thread類或其子類的實例對象。每個Thread對象描述了一個單獨的線程。要產生一個線程,有兩種方法:
◆需要從Java.lang.Thread類派生一個新的線程類,重載它的run()方法;
◆實現Runnalbe介面,重載Runnalbe介面中的run()方法。

熱點內容
寶馬x5買什麼配置性價比高 發布:2024-04-24 06:45:22 瀏覽:849
最小的編程語言 發布:2024-04-24 06:44:16 瀏覽:816
自動發朋友圈腳本 發布:2024-04-24 06:40:32 瀏覽:153
最早存儲盤 發布:2024-04-24 06:39:54 瀏覽:943
編程題優惠券 發布:2024-04-24 06:29:46 瀏覽:998
在線編程招聘 發布:2024-04-24 06:23:11 瀏覽:68
svn緩存文件 發布:2024-04-24 06:09:53 瀏覽:139
現在的我的世界伺服器推薦 發布:2024-04-24 05:46:39 瀏覽:151
安卓手機怎麼調節字體顏色 發布:2024-04-24 05:43:14 瀏覽:411
金蝶軟體如何下載加密伺服器 發布:2024-04-24 05:34:21 瀏覽:338