Android EditText 在点击时导致 OutOfMemoryError
Android EditText causes OutOfMemoryError when tapped
我创建了一个应用程序,最近重构为使用 ViewModel 和 Fragments。
有时我 运行 遇到一个问题:每次我点击 Edittext(或它的子类,如 EditTextInputLayout)时,我的应用程序都会因内存不足异常而崩溃。我什至不需要开始打字就会导致这个错误。错误无处不在,无论 EditText 是片段的一部分,简单的 activity 还是对话框。
05-23 12:44:55.712 13497-13497/com.ignates.myconomy E/AndroidRuntime: Error reporting crash
java.lang.OutOfMemoryError: Failed to allocate a 75738220 byte allocation with 16769200 free bytes and 54MB until OOM
at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:125)
at java.lang.StringBuffer.append(StringBuffer.java:278)
at java.io.StringWriter.write(StringWriter.java:123)
at com.android.internal.util.FastPrintWriter.flushLocked(FastPrintWriter.java:358)
at com.android.internal.util.FastPrintWriter.appendLocked(FastPrintWriter.java:303)
at com.android.internal.util.FastPrintWriter.write(FastPrintWriter.java:625)
at com.android.internal.util.FastPrintWriter.append(FastPrintWriter.java:658)
at java.io.PrintWriter.append(PrintWriter.java:691)
at java.io.PrintWriter.append(PrintWriter.java:31)
at java.lang.Throwable.printStackTrace(Throwable.java:324)
at java.lang.Throwable.printStackTrace(Throwable.java:300)
at android.util.Log.getStackTraceString(Log.java:343)
at com.android.internal.os.RuntimeInit.Clog_e(RuntimeInit.java:67)
at com.android.internal.os.RuntimeInit.access0(RuntimeInit.java:51)
at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:93)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
我做了什么:
- 我使用 Android Profiler 试图了解正在发生的事情。但是由于我没有分析方面的经验,我只能确定它分配
很多 String、char[] 和 StringBuilder 实例。
- 我注释掉了 TextView 或 EditText 上的任何扩展功能
- 确保正确实现了 ViewModel,并且没有片段实例保留在内存中
我所知道的
- 在某些时候我的每个 Edittext 都运行良好,但我无法确定实际时间点
- 我没有在我的应用程序中使用任何 BitMaps 或 ImageViews
- 内存水平在大约 5 秒内从大约 64mb 上升到 256mb,然后应用程序崩溃了。调用堆栈中还出现了很多 UncaughtExeptions。我检查了一切,不知道是什么原因造成的。探查器图像:Profiler callstack, Profiler memory.
示例片段
class SearchFragment : BaseFragment<SearchViewModel>(), SearchFragmentInterface, OnUserSelectedCallback {
val searchAdapter: SearchUserAdapter = SearchUserAdapter(this)
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.fragment_search, container, false)
override fun createViewModel(): SearchViewModel = ViewModelProviders.of(activity,
ViewModelFactory { return@ViewModelFactory SearchViewModel(activity.application, activityViewModel, this) }).get(SearchViewModel::class.java)
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
listener.setActionBar(search_toolbar) //Sets toolbar in activity
search_recycler.layoutManager = LinearLayoutManager(activity)
search_recycler.adapter = searchAdapter
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
search_input.isCursorVisible = false
/*search_input.onTextChange {
if (it != null && it.isNotEmpty()) mViewModel.queryUsers(it)
}*/
mViewModel.queryResults.observe(this, Observer {
it?.let { searchAdapter.setResults(it) }
})
}
override fun onUserSelected(user: UserNamePair) = mViewModel.onUserSelected(user)
override fun onError(e: Exception?, message: String) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
companion object {
@JvmStatic
fun newInstance() = SearchFragment()
}
我在这些问题上经验不多。感谢任何帮助。
事实证明,这个错误是高级分析中的一个已知错误。 。因为我的 editText 被封装在一个片段中,所以抛出了一个不同的错误,我找不到其他答案。
我创建了一个应用程序,最近重构为使用 ViewModel 和 Fragments。 有时我 运行 遇到一个问题:每次我点击 Edittext(或它的子类,如 EditTextInputLayout)时,我的应用程序都会因内存不足异常而崩溃。我什至不需要开始打字就会导致这个错误。错误无处不在,无论 EditText 是片段的一部分,简单的 activity 还是对话框。
05-23 12:44:55.712 13497-13497/com.ignates.myconomy E/AndroidRuntime: Error reporting crash
java.lang.OutOfMemoryError: Failed to allocate a 75738220 byte allocation with 16769200 free bytes and 54MB until OOM
at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:125)
at java.lang.StringBuffer.append(StringBuffer.java:278)
at java.io.StringWriter.write(StringWriter.java:123)
at com.android.internal.util.FastPrintWriter.flushLocked(FastPrintWriter.java:358)
at com.android.internal.util.FastPrintWriter.appendLocked(FastPrintWriter.java:303)
at com.android.internal.util.FastPrintWriter.write(FastPrintWriter.java:625)
at com.android.internal.util.FastPrintWriter.append(FastPrintWriter.java:658)
at java.io.PrintWriter.append(PrintWriter.java:691)
at java.io.PrintWriter.append(PrintWriter.java:31)
at java.lang.Throwable.printStackTrace(Throwable.java:324)
at java.lang.Throwable.printStackTrace(Throwable.java:300)
at android.util.Log.getStackTraceString(Log.java:343)
at com.android.internal.os.RuntimeInit.Clog_e(RuntimeInit.java:67)
at com.android.internal.os.RuntimeInit.access0(RuntimeInit.java:51)
at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:93)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
我做了什么:
- 我使用 Android Profiler 试图了解正在发生的事情。但是由于我没有分析方面的经验,我只能确定它分配 很多 String、char[] 和 StringBuilder 实例。
- 我注释掉了 TextView 或 EditText 上的任何扩展功能
- 确保正确实现了 ViewModel,并且没有片段实例保留在内存中
我所知道的
- 在某些时候我的每个 Edittext 都运行良好,但我无法确定实际时间点
- 我没有在我的应用程序中使用任何 BitMaps 或 ImageViews
- 内存水平在大约 5 秒内从大约 64mb 上升到 256mb,然后应用程序崩溃了。调用堆栈中还出现了很多 UncaughtExeptions。我检查了一切,不知道是什么原因造成的。探查器图像:Profiler callstack, Profiler memory.
示例片段
class SearchFragment : BaseFragment<SearchViewModel>(), SearchFragmentInterface, OnUserSelectedCallback {
val searchAdapter: SearchUserAdapter = SearchUserAdapter(this)
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.fragment_search, container, false)
override fun createViewModel(): SearchViewModel = ViewModelProviders.of(activity,
ViewModelFactory { return@ViewModelFactory SearchViewModel(activity.application, activityViewModel, this) }).get(SearchViewModel::class.java)
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
listener.setActionBar(search_toolbar) //Sets toolbar in activity
search_recycler.layoutManager = LinearLayoutManager(activity)
search_recycler.adapter = searchAdapter
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
search_input.isCursorVisible = false
/*search_input.onTextChange {
if (it != null && it.isNotEmpty()) mViewModel.queryUsers(it)
}*/
mViewModel.queryResults.observe(this, Observer {
it?.let { searchAdapter.setResults(it) }
})
}
override fun onUserSelected(user: UserNamePair) = mViewModel.onUserSelected(user)
override fun onError(e: Exception?, message: String) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
companion object {
@JvmStatic
fun newInstance() = SearchFragment()
}
我在这些问题上经验不多。感谢任何帮助。
事实证明,这个错误是高级分析中的一个已知错误。