Какова утечка в следующем коде Java / Kotlin? - PullRequest
0 голосов
/ 24 сентября 2019

При использовании профилировщика я обнаружил, что один экземпляр Fragment все еще там, даже после извлечения его из заднего стека.После рытья много я обнаружил, что это RecyclerView, который протекает.

Я удалил onClickListener, и вытекший фрагмент был удален из кучи, но RecyclerView остался, что не должно происходить как RecyclerView является частью фрагмента, который уже собран.Сначала я подумал, что это может быть потому, что kotlin компилирует код в байт-код java 1.6, но это не так.Весь данный код принадлежит классу Fragment.

Java

private void setUpRecycler(View view) {
        final SimpleRecyclerViewAdapter<JSONObject> adapter = new SimpleRecyclerViewAdapter<>(R.layout.first_aid_card);
        adapter.setItems(getJSONArray());
        adapter.setOnBindViewHolderListener((v, i) -> {
            try {
                ((TextView) v.itemView.findViewById(R.id.title)).setText(adapter.getItems().get(i).getString("disease"));
                ((TextView) v.itemView.findViewById(R.id.calorie)).setText(adapter.getItems().get(i).getString("description"));
            }catch (Exception e){
                e.printStackTrace();
            }
            v.itemView.setOnClickListener(v1 -> {
                Fragment fragment = new AidDescriptionFrag();
                Bundle bundle = new Bundle();
                bundle.putInt("index", i);
                fragment.setArguments(bundle);
                ((HomeActivity) activity).replaceFrag(fragment, true);
            });
        });
        final RecyclerView recyclerView = view.findViewById(R.id.first_aids);
        recyclerView.setHasFixedSize(true);
        recyclerView.setNestedScrollingEnabled(false);
        recyclerView.setLayoutManager(new LinearLayoutManager(activity, RecyclerView.VERTICAL, false));
        recyclerView.setAdapter(adapter);
    }

Kotlin

private fun setUpRecycler(view: View) {
        val adapter = SimpleRecyclerViewAdapter<JSONObject>(R.layout.first_aid_card)
        adapter.items = getJSONArray()
        adapter.setOnBindViewHolderListener { v, i ->
        v.itemView.findViewById<TextView>(R.id.title).text = adapter.items[i].getString("disease")
        v.itemView.findViewById<TextView>(R.id.calorie).text = adapter.items[i].getString("description")
        v.itemView.setOnClickListener {
        (activity as HomeActivity).replaceFrag(AidDescriptionFrag().also { it.arguments = Bundle().also { it.putInt("index", i) } }, true)
        }
        }
        val recyclerView = view.findViewById<RecyclerView>(R.id.first_aids)
        recyclerView.setHasFixedSize(true)
        recyclerView.isNestedScrollingEnabled = false
        recyclerView.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
        recyclerView.adapter = adapter
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...