android中開啟子執行緒
有些東西是需要總結下了。。。在面試過程中,被問到,如何開啟一個子執行緒的時候。。。腦子裡忘得只剩new Thread物件了,還有就是沒有意識到自己是否在主執行緒中做了耗時操作,這些都是很致命的。兜兜轉轉,還是java基礎差惹的禍,咱給補上。
AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MainActivity}: android.os.NetworkOnMainThreadException
如果你在主執行緒中做了一些耗時操作,那麼會報這個錯誤android.os.NetworkOnMainThreadException
解決這個錯誤的的方法很簡單,就是把這個方法,移動到你new出來的Thread類中就可以了,這也是人們常說的不要在主執行緒中做一些耗時操作,犯了大忌。。。。
在Android啟動執行緒和JAVA一樣有兩種方式,一種是直接建立Thread類物件,然後呼叫start方法,也就是一般寫一個自己自定義的類來繼承Thread類,然後呼叫start方法啟動,至於你要問run()方法和start()方法有什麼區別。。。我只能無語了,run()方法中是寫你這個Thread中具體要做的事情(一般是耗時操作等必須寫在這裡面),start()方法是啟動這個執行緒,兩個方法是不同的概念。另外一種方式就是實現Runnable介面,然後把實現了Runnable介面的子類物件傳遞給Thread類,同樣要start這個執行緒。總之都是需要建立Thread物件,然後呼叫Thread類的start方法啟動執行緒。區別就是,一個是直接建立Thread物件,然後extends(繼承)了Thread類,另外一個是需要implement(實現)了Runnable介面物件作為建立Thread物件的引數。Android開闢子執行緒就只有這兩種方式了。
activity中的示例程式碼
package com.example.viewpagerdemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
}
private void initData() {
// 1、直接new 一個執行緒類,傳入引數實現Runnable介面的物件(new Runnable),相當於方法二
new Thread(new Runnable() {
@Override
public void run() {
// 寫子執行緒中的操作
}
}).start();
// 2、通過實現Runnable介面
Thread t = new Thread(new myRunnable());
t.start();
// 3、通過繼承執行緒類實現
new myThread().start();
}
// Thread是一個類,必須繼承
public class myThread extends Thread {
@Override
public void run() {
super.run();
// 寫子執行緒中的操作
}
}
// Runnable是一個介面,需要實現
public class myRunnable implements Runnable {
@Override
public void run() {
// 寫子執行緒中的操作
}
}
}
另外一個我覺得是坑的地方就是android中獨有的Handler訊息機制,Android主要的考慮到更新介面的問題,一般情況下,更新介面都是在UI主執行緒中更新的,意思就是隻能在當前Activity建立的時候會自動生成的UI主執行緒中進行UI的更新,那麼,我們能想到的方式就是,拿到主執行緒,進行UI的更新,貌似谷歌3.0還是多少就拋棄了這種方式,這樣很容易阻塞UI主執行緒,程式很容易崩潰,通常這樣聯網耗時的工作需要開闢另外一個執行緒的,這樣就不會影響主程式了。歸根到底,這是不是更Android中的單繼承有關,所以android中提供了Handler這個概念。舉個例子:在下載檔案時候我們需要進度條顯示下載進度,介面需要不斷更新,就需要用到Handler了。一般實現這種方式需要用到Thread+Handler的方式,隔多少秒在子執行緒中獲取下載了多少的資料,在子執行緒中獲取到Message物件(兩種方式1、Message msg = Message.obtain();2、Message msg=new Message();建議用第一種方式,不採用new的方式,就是在當前的訊息執行緒池中獲取Message這個物件),然後通過Handler的sendMessage()方法傳送得到的下載的資料(如果你對Intent中資料的傳遞熟悉的話,就應該知道Bundle物件。。。資料包,我們老師教的時候就把它類比成快遞的打包然後再拆分。。。那就更別說int,String這些單資料型別了),當你呼叫了sendMessage方法後,Handler就會回撥Handler中的 HandlerMessage方法,在這個方法中你可以對資料包進行拆分,對控制元件進行賦值。。。相當於通知主執行緒更新介面(這個方法,在你new Handler()這個方法中會要求重寫這個方法HandlerMessage)。可以可以,寫了一遍後,我自己都覺得清楚了一些。。。。。Thread+Handler的方式還是比較常規的方式
相關推薦
android中開啟子執行緒
有些東西是需要總結下了。。。在面試過程中,被問到,如何開啟一個子執行緒的時候。。。腦子裡忘得只剩new Thread物件了,還有就是沒有意識到自己是否在主執行緒中做了耗時操作,這些都是很致命的。兜兜轉轉,還是java基礎差惹的禍,咱給補上。 AndroidRu
為什麼不能在BroadcastReceiver中開啟子執行緒
當一個廣播訊息被Receiver監聽到時,Android會呼叫它的onReceive()方法,並將包含訊息的 Intent物件傳給它處理, onReceive() 方法的執行時間不能超過10 秒,否則會導致ANR。 那麼,相信很多人在這裡跟我有同樣的疑惑:此時直接在Broadc
android-如何在子執行緒中更新ui
正如我們知道的,android是不讓在子執行緒中更新ui的。在子執行緒中更新ui會直接丟擲異常 Only the original thread that created a view hierarchy can touch its views 那麼這種檢查
Android可以在子執行緒更新(重新整理)UI---"假象"
有時候,我們線上程裡面需要彈框,然而在用Toast彈框後,會出一個Can't create handler inside thread that has not called Looper.prepare() 錯誤。。。。原因很簡單就是因為安卓介面更新的操作需要在主執行緒操作. 實現
Android中使用非同步執行緒更新UI檢視的幾種方法
在Android中子執行緒是不能更新ui的。 所以我們要通過其他方式來動態改變ui檢視, 1、runOnUiThreadactivity提供的一個輕量級更新ui的方法,在Fragment需要使用的時候要用getActivity.runOnUiThread開啟執行緒 這種方法最簡單,方便更新一些不需要判斷的
Android可以在子執行緒更新(重新整理)UI---"假象"
有時候,我們線上程裡面需要彈框,然而在用Toast彈框後,會出一個Can't create handler inside thread that has not called Looper.prepare() 錯誤。。。。原因很簡單就是因為安卓介面更新的操作需要在主執行緒操
Android 中如何關閉執行緒
在android中開啟的執行緒用Thread.stop()來關閉是不會真正關閉的,當我們再次start執行緒的時候,會產生異常:Thread is already started. 針對這個問題可以線上程的run方法裡,加一個判斷標誌。例如: clas
java開啟子執行緒的方法及優化
1.new Thread的弊端 執行一個非同步任務你還只是如下new Thread嗎? 1 2 3 4 5 6 7 new Thread(new Runnable() { &
Android中為什麼主執行緒不會因為Looper.loop()方法造成阻塞
很多人都對Handler的機制有所瞭解,如果不是很熟悉的可以看看我 如果看過原始碼的人都知道,在處理訊息的時候使用了Looper.loop()方法,並且在該方法中進入了一個死迴圈,同時Looper.loop()方法是在主執行緒中呼叫的,那麼為什麼沒有造成阻
四. 執行緒管理之Android中的多執行緒
不忘初心 砥礪前行, Tomorrow Is Another Day ! 相關文章 一. 執行緒管理之Thread基礎 二. 執行緒管理之執行緒池 三. 執行緒管理之ThreadLocal 四. 執行緒管理之Android中的多執行緒 本文概要: AsyncTas
執行緒狀態,開啟子執行緒的3種方式(Callable)
(理理基礎是很有必要的) 先看一張非常好的圖 注意,當你start一個執行緒,他只是處於可執行狀態,不一定會立刻執行,這取決於作業系統分配給你的時間 建立方式1,繼承Thread class MyThread extends Thread { @Overri
開啟子執行緒的三種方式
package com.you; import java.util.Date; /** * 多執行緒的實現方式 * 1、繼承Thread類 * 2、實現Runnable介面 * @a
Android Handler(子執行緒Handler)非同步訊息處理機制的妙用(活用訊號量) 建立強大的圖片載入類
最近建立了一個群,方便大家交流,群號:55032675 上一篇部落格介紹了Android非同步訊息處理機制,如果你還不瞭解,可以看:Android 非同步訊息處理機制 讓你深入理解 Looper、Handler、Message三者關係 。那篇部落格的最後
android service與子執行緒之淺談
最近在做一個android的專案,有一個操作是首先將接收的資料處理分析,然後將處理過的資料儲存到資料庫中。這將是一個十分耗時的工作。我直接將這一操作寫在了UI主執行緒中。結果log中提示不要把耗時的工作在主執行緒中完成。於是在網上查閱了一下,發現網上有兩種說法:一種說寫
Android中判斷當前執行緒是否是主執行緒
通過Thread.currentThread()得到當前執行緒,通過Looper.getMainLooper().getThread()得到主執行緒,進行比較即可。 public boolean isMainThread() { return Thre
android中關於對執行緒池的理解以及操作
在android中很多時候我們需要處理一些比較耗時的操作,而在android中明確的規定主執行緒不能進行一些耗時的操作,如果要進行一些耗時的操作,那麼就必須要開啟子執行緒去處理。那麼問題就來了。是否我們可以不斷地去new出子執行緒呢?答案是否定的
為什麼在Service中建立子執行緒而不是Activity中
這是因為Activity很難對Thread進行控制,當Activity被銷燬之後,就沒有任何其它的辦法可以再重新獲取到之前建立的子執行緒的例項。而且在一個Activity中建立的子執行緒,另一
Android中在主執行緒呼叫Thread.sleep()會導致Handler.postDelayed()在sleep的這段時間無法執行。
場景是一個公司之前的老專案裡面有人使用了Handler.postDelayed(mRunnable,1000)做一個重複計時並且累加的功能,需求是每一秒都要跑一次這個Runnable,同時是有視訊在播放的,Runnable裡面是比較視訊播放的進度和我跑了多少秒來比對,再確定要
Android開發——實現子執行緒更新UI
Android中執行緒按功能分的話,可以分為兩個,一個是主執行緒(UI執行緒),其他的都是子執行緒 主執行緒不能執行那些耗時過長的程式碼或任務(執行耗時過長的程式碼會出現應用未響應的提示),所以都是使用子執行緒來執行耗時過長的程式碼,比如說下載檔案等任務 一般情況,子執行緒中執行過長的程式碼,都是需要進行更新
Android執行緒模型--在子執行緒中更新UI
Android是支援多執行緒的。主執行緒也稱UI執行緒,子執行緒也稱工作執行緒。一般耗時操作在子執行緒中進行,更新UI操作在主執行緒中進行。在主執行緒中執行耗時操作容易發生ANR錯誤,即應用程式無響應。而Android中又規定只有建立UI的執行緒