程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> 編程-Android線程與ui繪制的問題

編程-Android線程與ui繪制的問題

編輯:編程解疑
Android線程與ui繪制的問題

當然知道只能在主線程更新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)

最佳回答:


弱引用的方式,防止內存洩漏

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved