Android EditText вызывает OutOfMemoryError при касании - PullRequest
0 голосов
/ 23 мая 2018

Я создал приложение, которое я недавно реорганизовал для использования ViewModel и Fragments.В какой-то момент я столкнулся с проблемой: каждый раз, когда я нажимал на Edittext (или его подкласс, такой как EditTextInputLayout), мое приложение вылетало с нехваткой памяти.Мне даже не нужно начинать печатать, чтобы вызвать эту ошибку.Ошибка возникает везде, независимо от того, является ли EditText частью фрагмента, простого действия или диалога.

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.access$200(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
  • УбедилсяViewModels реализованы правильно, и никакие фрагменты не сохраняются в памяти

Что я знаю

  • В какой-то момент каждый мой Edittext работал хорошо, ноя не могу определить фактический момент времени
  • Я не использую в своем приложении какие-либо BitMaps или ImageViews
  • Уровень памяти поднимается примерно с 64 МБ до 256 МБ примерно за 5 секунд, а затем приложение вылетает.Также много вызовов UncaughtExeptions появляются в стеке вызовов.Я проверил все и не знаю, что вызывает это.Изображения профилировщика: Профилировщик callstack , Профилировщик памяти .

Пример фрагмента

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()
}

Донне имеет большого опыта в этих вопросах.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 23 мая 2018

Как оказалось, эта ошибка является известной ошибкой в ​​расширенном профилировании. Отключение опции решает проблему .Поскольку мой editText был инкапсулирован во фрагмент, произошла разная ошибка, и я не смог найти другой ответ.

...