當然知道只能在主線程更新UI,不過我有個非常費時的UI繪制操作(就是一堆自定義的view退出時保存在文件裡,然後進入時讀取文件繪制ui恢復界面,實測短板出現在view的繪制過程)
然後我一開始覺得只要View不添加就只是對象而已,然後嘗試新開一個線程把這些控件new出來,然後在主線程addView,結果在我的平板(5.1.1)上完美運行,在手機(4.2.2)上閃退。
繼續測試手機,新開一個線程,一個執行一句new一個edittext就崩潰,不過更加奇怪的是換成textview就正常。完全不明就裡。
ps,大家有什麼替代方法,也望不吝賜教,感激不盡
按照大家的提醒貼代碼(實際的代碼太長不便理解,我就寫了一個TextView和EditText的,意思一樣,而且方便大家理解。)
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
new Thread(new Runnable() {
@Override
public void run() {
try {
new TextView(mActivity);
} catch (Exception e) {
Log.d("debug", Log.getStackTraceString(e));
return;
}
Log.d("debug", "成功地new了一個TextView");
try {
new EditText(mActivity);
} catch (Exception e) {
Log.d("debug", Log.getStackTraceString(e));
return;
}
Log.d("debug", "成功地new了一個EditText");
}
}).start();
}
附上Logcat輸出:
02-23 03:29:13.144 16364-16440/com.example.multicalc D/debug: 成功地new了一個TextView
02-23 03:29:13.156 16364-16440/com.example.multicalc D/debug: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.(Handler.java:197)
at android.os.Handler.(Handler.java:111)
at android.widget.Editor$UserDictionaryListener.(Editor.java:3836)
at android.widget.Editor.(Editor.java:192)
at android.widget.TextView.createEditorIfNeeded(TextView.java:8475)
at android.widget.TextView.(TextView.java:1114)
at android.widget.EditText.(EditText.java:60)
at android.widget.EditText.(EditText.java:56)
at android.widget.EditText.(EditText.java:52)
at com.example.multicalc.matrix.ui.WorkWindow$1.run(WorkWindow.java:174)
at java.lang.Thread.run(Thread.java:856)
弱引用的方式,防止內存洩漏