Фильтр CustomAdapter, вызывающий утечку памяти - PullRequest
0 голосов
/ 31 октября 2018

У меня есть одно приложение со списком. Он имеет верхний текст для фильтрации текстов и ячеек (поле поиска). Однако, когда в зависимости от типа приложения происходит сбой. Я исследовал об ошибке и, похоже, проблема утечки памяти. Утечка памяти - причина, потому что GC не может обнаружить некоторые элементы, и так как это фильтрующая функция, я думаю, это действительно может быть проблема утечки памяти, верно?

Ошибка, которую я получаю, это

    --------- beginning of crash
2018-10-31 15:34:49.896 2389-2389/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2018-10-31 15:34:49.896 2389-2389/? A/DEBUG: Build fingerprint: 'xiaomi/whyred/whyred:8.1.0/OPM1.171019.011/V10.0.2.0.OEIMIFH:user/release-keys'
2018-10-31 15:34:49.896 2389-2389/? A/DEBUG: Revision: '0'
2018-10-31 15:34:49.896 2389-2389/? A/DEBUG: ABI: 'arm64'
2018-10-31 15:34:49.897 2389-2389/? A/DEBUG: pid: 31358, tid: 2385, name: Filter  >>> com.appdidier.atend <<<
2018-10-31 15:34:49.897 2389-2389/? A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
2018-10-31 15:34:49.916 2389-2389/? A/DEBUG: Abort message: 'Could not create epoll instance: Too many open files'
2018-10-31 15:34:49.916 2389-2389/? A/DEBUG:     x0   0000000000000000  x1   0000000000000951  x2   0000000000000006  x3   0000000000000008
2018-10-31 15:34:49.916 2389-2389/? A/DEBUG:     x4   fefeff7ddf6a4487  x5   fefeff7ddf6a4487  x6   fefeff7ddf6a4487  x7   7f7f7f7fff7f7fff
2018-10-31 15:34:49.916 2389-2389/? A/DEBUG:     x8   0000000000000083  x9   3f8307f479ae5397  x10  0000000000000000  x11  0000000000000001
2018-10-31 15:34:49.916 2389-2389/? A/DEBUG:     x12  ffffffffffffffff  x13  ffffffffffffffff  x14  ffffffffff000000  x15  ffffffffffffffff
2018-10-31 15:34:49.916 2389-2389/? A/DEBUG:     x16  00000003eac72fa8  x17  0000007fa377664c  x18  0000007f2040e870  x19  0000000000007a7e
2018-10-31 15:34:49.916 2389-2389/? A/DEBUG:     x20  0000000000000951  x21  0000000000000001  x22  0000007ee06b4588  x23  0000007ee06b4588
2018-10-31 15:34:49.916 2389-2389/? A/DEBUG:     x24  0000000000000004  x25  0000007ee06b4588  x26  0000007f02bea4a0  x27  0000000000000001
2018-10-31 15:34:49.916 2389-2389/? A/DEBUG:     x28  0000007ee06b4588  x29  0000007ee06b3900  x30  0000007fa372beac
2018-10-31 15:34:49.916 2389-2389/? A/DEBUG:     sp   0000007ee06b38c0  pc   0000007fa372bec8  pstate 0000000060000000
2018-10-31 15:34:50.132 29956-29979/? I/Finsky: [14364] com.google.android.finsky.bn.an.run(6): Stats for Executor: BlockingExecutor com.google.android.finsky.bn.ao@3b878ae[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 7]
2018-10-31 15:34:50.133 29956-29979/? I/Finsky: [14364] com.google.android.finsky.bn.an.run(6): Stats for Executor: LightweightExecutor com.google.android.finsky.bn.ao@ee4964f[Running, pool size = 4, active threads = 0, queued tasks = 0, completed tasks = 42]
2018-10-31 15:34:50.153 11286-11303/? W/LocalConnector: Cannot connect the wmserver-data-reciever
2018-10-31 15:34:50.206 29956-29979/? I/Finsky: [14364] com.google.android.finsky.bn.an.run(6): Stats for Executor: bgExecutor com.google.android.finsky.bn.ao@d3a41dc[Running, pool size = 4, active threads = 0, queued tasks = 0, completed tasks = 9]
2018-10-31 15:34:50.338 2389-2389/? A/DEBUG: backtrace:
2018-10-31 15:34:50.338 2389-2389/? A/DEBUG:     #00 pc 000000000001dec8  /system/lib64/libc.so (abort+104)
2018-10-31 15:34:50.338 2389-2389/? A/DEBUG:     #01 pc 0000000000007f20  /system/lib64/liblog.so (__android_log_assert+304)
2018-10-31 15:34:50.338 2389-2389/? A/DEBUG:     #02 pc 000000000001570c  /system/lib64/libutils.so (android::Looper::rebuildEpollLocked()+348)
2018-10-31 15:34:50.338 2389-2389/? A/DEBUG:     #03 pc 000000000001556c  /system/lib64/libutils.so (android::Looper::Looper(bool)+236)
2018-10-31 15:34:50.338 2389-2389/? A/DEBUG:     #04 pc 000000000011993c  /system/lib64/libandroid_runtime.so (android::NativeMessageQueue::NativeMessageQueue()+160)
2018-10-31 15:34:50.338 2389-2389/? A/DEBUG:     #05 pc 000000000011a26c  /system/lib64/libandroid_runtime.so (android::android_os_MessageQueue_nativeInit(_JNIEnv*, _jclass*)+28)
2018-10-31 15:34:50.338 2389-2389/? A/DEBUG:     #06 pc 00000000009c2c70  /system/framework/arm64/boot-framework.oat (offset 0x9c0000) (android.os.Binder.clearCallingIdentity [DEDUPED]+144)
2018-10-31 15:34:50.338 2389-2389/? A/DEBUG:     #07 pc 00000000000f3470  /dev/ashmem/dalvik-jit-code-cache (deleted)

Вот часть моего кода, которая выполняет настройку адаптера:

myCustomAdapter = new CustomAdapter(listUsuarios);
listView.setAdapter(myCustomAdapter);
setupListeners();
myCustomAdapter.notifyDataSetChanged();

Это ключевой слушатель поискового текста редактирования

edtSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                previousLength = edtSearch.getText().length();
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                if (previousLength > edtSearch.getText().length()) {
                    myCustomAdapter.setDataObjects(listUsuarios);
                }

                myCustomAdapter.getFilter().filter(edtSearch.getText().toString());
                myCustomAdapter.notifyDataSetChanged();
            }

            @Override
            public void afterTextChanged(Editable editable) {
            }
        });

И это часть класса моего пользовательского адаптера, который, я думаю, имеет значение для этого вопроса (я подозреваю, что проблема утечки памяти может быть здесь при использовании метода getFilter):

public class CustomAdapter extends BaseAdapter {

        private List<Usuario> dataObjects;

        public List<Usuario> getDataObjects() {
            return dataObjects;
        }

        public void setDataObjects(List<Usuario> dataObjects) {
            this.dataObjects = dataObjects;
        }

        public CustomAdapter(List<Usuario> dataObjects) {
            this.dataObjects = dataObjects;
        }

        @Override
        public int getCount() {
            return dataObjects.size();
        }

        @Override
        public Object getItem(int i) {
            return dataObjects.get(i);
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        public Filter getFilter() {
            return new Filter() {

                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                    final FilterResults oReturn = new FilterResults();
                    final ArrayList<Usuario> results = new ArrayList<Usuario>();
                    if (constraint != null) {
                        if (dataObjects != null && dataObjects.size() > 0) {
                            for (final Usuario g : dataObjects) {
                                if (g.getNome().toLowerCase()
                                        .contains(constraint.toString()))
                                    results.add(g);
                            }
                        }
                        oReturn.values = results;
                    }
                    return oReturn;
                }

                @SuppressWarnings("unchecked")
                @Override
                protected void publishResults(CharSequence constraint,
                                              FilterResults results) {
//                    Log.d("MYTAG", "" + dataObjects.get(0).getNome());
                    dataObjects = (ArrayList<Usuario>) results.values;
                    notifyDataSetChanged();
                }
            };
        }

        @Override
        public void notifyDataSetChanged() {
            super.notifyDataSetChanged();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...