2014-09-13 80 views
-1

我的活動崩潰與OutOfMemoryError,但我找不到方法來捕獲它?Android EditText.setText字符串非常大時OutOfMemoryError

這是一個簡單的活動,即將一個字符串變量添加到edittext中。

try { 
    counter_pat_text.setText(Main.content); 
}catch(OutOfMemoryError e){ 
    Toast.makeText(Edittext.this, "Text file to large!", Toast.LENGTH_LONG).show(); 
} 

,你可以看到我試着捕捉錯誤而設置的EditText文本,但logcat的似乎顯示活動失敗,因爲它的繪圖佈局?

字符串變量「content」在調用活動「Main」中,當內容很小時,我不會收到任何錯誤,當使用edittext打開第二個活動時,活動和edittext將起作用。

因此,當內容變量非常大(932974個字符)時無法加載活動時,如何捕獲OutOfMemoryError?或者我如何計算內容變量中的字符數量會導致活動崩潰,以便在調用活動中截斷它?

09-13 15:56:22.340: E/AndroidRuntime(20341): FATAL EXCEPTION: main 
09-13 15:56:22.340: E/AndroidRuntime(20341): java.lang.OutOfMemoryError: (Heap Size=26695KB, Allocated=15242KB, Bitmap Size=308KB) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.text.StaticLayout.out(StaticLayout.java:994) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.text.StaticLayout.generate(StaticLayout.java:531) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.text.DynamicLayout.reflow(DynamicLayout.java:261) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.text.DynamicLayout.<init>(DynamicLayout.java:150) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.widget.TextView.makeNewLayout(TextView.java:5266) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.widget.TextView.onMeasure(TextView.java:5601) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.view.View.measure(View.java:8553) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1082) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.widget.ScrollView.onMeasure(ScrollView.java:296) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.view.View.measure(View.java:8553) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.widget.HorizontalScrollView.measureChildWithMargins(HorizontalScrollView.java:1083) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.widget.HorizontalScrollView.onMeasure(HorizontalScrollView.java:302) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.view.View.measure(View.java:8553) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3261) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.view.View.measure(View.java:8553) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.widget.LinearLayout.measureVertical(LinearLayout.java:531) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.view.View.measure(View.java:8553) 
09-13 15:56:22.340: E/AndroidRuntime(20341): at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:873) 
+0

你覺得我還沒試過谷歌?前20項結果不涉及編輯文本或如何捕捉活動時的陷阱! – Mark 2014-09-13 15:22:59

+1

Android UI運行事件循環。您的try-catch失敗,因爲實際異常發生在事件循環的後續迭代中。我可以從堆棧跟蹤中看出它在測量視圖期間發生。你可以創建EditText的子類,並在你的子類中覆蓋'onMeasure(...)'方法。將try-catch放在'super.onMeasure(...)'調用中。 – Barend 2014-09-13 15:25:29

+0

在EditText中顯示多個字符的目的是什麼? – Tom 2014-09-13 15:34:03

回答

1

雖然您可以編寫試圖捕獲錯誤的代碼,但絕對不能保證它能正常工作。對於Error類的Javadoc說:

An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch.

由DVM拋出一個錯誤的時間,這是嚴重的麻煩,很可能是不可恢復的狀態。雖然你可以編寫代碼,看似趕上錯誤:

try { 
    //... 
} catch (Throwable t) { 
    // .. 
} 

......它在風中幾乎吹哨。 JVM已經盡力告訴你它已經太晚了。

...來吧! 932974個字符?那是1M!

+0

什麼是計算可以防止錯誤的edittext字符的最大數量的方法?然後我可以截斷輸入。 – Mark 2014-09-13 15:58:46

+1

我看不出有什麼相關的!限制不在於內存容納多少個字符,而是用戶能夠看到多少。你爲什麼不知道在合理的頁面上會有多少個字符? – 2014-09-13 16:00:01

+0

Edittext處於滾動視圖,因此用戶可以看到他們準備滾動。我除了輸入需要被截斷以停止崩潰,但是也要截斷它呢?因此,以前的評論。 – Mark 2014-09-13 16:02:29

相關問題