当字符串非常大时,Android EditText.setText OutOfMemoryError

时间:2014-09-13 15:12:48

标签: android android-edittext out-of-memory

我的活动因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似乎显示活动失败,因为它正在绘制布局?

字符串变量"内容"是在主叫"主要"当内容很小时,我没有错误,当使用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)

1 个答案:

答案 0 :(得分:1)

虽然您可以编写尝试捕获错误的代码,但绝对无法保证它能够正常工作。 Error类的Javadoc说:

  

错误是Throwable的子类,表示严重问题   合理的申请不应该试图抓住。

当DVM抛出错误时,它处于严重的麻烦状态,可能处于不可恢复的状态。虽然您可以编写看起来可以捕获错误的代码:

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

......在风中几乎是吹口哨。 JVM已经尽力告诉你现在为时已晚。

......来吧! 932974个字符???那是1M!