字符串非常大时发生Android EditText.setText OutOfMemoryError



我的活动因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)

虽然您可以编写试图捕获错误的代码,但绝对不能保证它会工作。Error类的Javadoc说:

Error是Throwable的一个子类,表示存在严重问题一个合理的应用程序不应该试图捕捉。

当DVM抛出错误时,它已陷入严重故障,很可能处于不可恢复的状态。当你可以写代码,似乎捕捉错误:

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

风中吹着口哨。JVM已经尽了最大努力来告诉您已经太迟了。

加油!932974个字符???这是1M!

最新更新