下面這段代碼,在子執行緒種創建了一個Handler,沒有呼叫Looper.prepare(),然而沒有報錯。
并且,第一個test日志 Looper.myLooper()為null,第二個test日志 Looper.myLooper()不為null。
難道new Handler()還能自動創建Looper?
PS: 在公司的電腦上運行不報錯,同樣的代碼,在我的電腦上報錯,公司和我的電腦jdk不一樣,但sdk都是用的android-25,handler是android.os下面的,和jdk應該無關吧?
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initLooperAndThread();
}
private void initLooperAndThread(){
new Thread(){
@Override
public void run() {
Log.i("test", Looper.myLooper()+"");
MyHandler handler = new MyHandler();
Log.i("test", Looper.myLooper()+"");
}
}.start();
}
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
}
uj5u.com熱心網友回復:
你確定在公司的代碼是這樣?uj5u.com熱心網友回復:
可能是你的機器太流弊了uj5u.com熱心網友回復:
確定,早上試了好幾遍,代碼和我測驗的一模一樣
uj5u.com熱心網友回復:
能把你的這個專案發到我的郵箱[email protected]我看看 。。。uj5u.com熱心網友回復:
報的是什么錯?uj5u.com熱心網友回復:
你是在真機上測驗的還是模擬器?可能真機上有優化uj5u.com熱心網友回復:
機器不同,或者Android系統版本不同華為android10,列印出了下面資訊,但是沒保存沒崩潰,APP正常運行
E/Handler: This is not main thread, and the caller should invoke Looper.prepare() and Looper.loop()called byandroid.os.Handler.<init>:122 com.test.MainActivity$MyHandler.<init>:82 com.test.MainActivity$1.run:76 <bottom of call stack> <bottom of call stack> <bottom of call stack> <bottom of call stack> <bottom of call stack>
另一個8.1的系統 報錯崩潰
E/AndroidRuntime: FATAL EXCEPTION: Thread-2
Process: com.test, PID: 15199
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
uj5u.com熱心網友回復:
看下面的原始碼,Handler的構造方法,肯定會拋出例外的,之所以你沒有例外,應該是模擬器或者真機的特殊情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/175304.html
標籤:Android
