Memory leaks on Android

1

Good morning, my first time here. I am learning in a totally self-taught way to program in Java , mainly for Android .

I could use the opinion of those who know about memory leaks very well (For now this is what is making it harder for me to understand.)

The question in the end is, what part of these codes causes memory leaks ?

This is what the DDMS shows after a screen orientation change filtering by the name of the main package: DDMS Output ... and the codes of the classes involved are:

ScreenSearchFragment.java

public class ScreenSearchFragment extends Fragment{

    private RecyclerSearchAdapter myAdapter;
    private DialogSearch dialog;
    private static final String TAG_DIALOG = "Search Dialog";

    @NonNull
    public static ScreenSearchFragment newInstance(String tabTitle){
        String title = "title";

        ScreenSearchFragment fragment = new ScreenSearchFragment();
        Bundle arguments = new Bundle();
        arguments.putString(title, tabTitle);
        fragment.setArguments(arguments);
        return fragment;
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,
                             @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_screen_definition, container, false);
        FloatingActionButton btnAddWord = (FloatingActionButton) view.findViewById(R.id.btn_add_word);
        if(dialog == null) {
            Log.d("ScreenSearchFragment", "dialog es null");
            dialog = new DialogSearch();
        }

        btnAddWord.setOnClickListener(new MyOnClickListener(dialog, getFragmentManager()));

        return view;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        initAdapter();
        setRecycler(view);

    }

    private void initAdapter(){
        List<Word> words = new ArrayList<>();
        myAdapter = new RecyclerSearchAdapter(words);

        //Examples
        myAdapter.addWord(new Word("Word 1", "Here is the definition of the word"));
        myAdapter.addWord(new Word("Word 2", "Here is the definition of the word"));
        myAdapter.addWord(new Word("Word 3", "Here is the definition of the word"));
        myAdapter.addWord(new Word("Word 4", "Here is the definition of the word"));
        myAdapter.addWord(new Word("Word 5", "Here is the definition of the word"));

        //Example multiline
        myAdapter.addWord(new Word("Word 6", "Here \nis \nthe \ndefinition \nof \nthe \nword"));
    }

    private void setRecycler(View view){
        RecyclerView rV = (RecyclerView) view.findViewById(R.id.recycler_search);
        RecyclerView.LayoutManager llm = new LinearLayoutManager(view.getContext());

        rV.setLayoutManager(llm);
        rV.setAdapter(myAdapter);

        DefaultItemAnimator itmAnim = new DefaultItemAnimator();

        itmAnim.setAddDuration(1000);
        itmAnim.setRemoveDuration(200);
        itmAnim.setMoveDuration(800);

        rV.setItemAnimator(itmAnim);

        //Delete item when is swiped to LEFT
        ItemTouchHelper.SimpleCallback simpleCallback = new MySimpleCallback();

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
        itemTouchHelper.attachToRecyclerView(rV);
    }

    private static class MyOnClickListener implements View.OnClickListener {
        private final DialogSearch dialog;
        private final FragmentManager fragmentManager;

        MyOnClickListener(DialogSearch dialog, FragmentManager fm) {
            this.dialog = dialog;
            this.fragmentManager = fm;
        }

        @Override
        public void onClick(View v) {
            if(v.getId() == R.id.btn_add_word) {
                if (!dialog.isVisible()) {
                    dialog.show(fragmentManager, TAG_DIALOG);
                }
            }
        }
    }

    private class MySimpleCallback extends ItemTouchHelper.SimpleCallback {
        MySimpleCallback() {
            super(0, ItemTouchHelper.LEFT);
        }

        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
                              RecyclerView.ViewHolder target) {
            return true;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            if (direction == ItemTouchHelper.LEFT){
                myAdapter.removeWord(viewHolder.getLayoutPosition());
            }
        }
    }
}

DialogSearch.java

public class DialogSearch extends DialogFragment implements View.OnClickListener {

    private ProgressBar progressBar;
    private Button btnCancel;
    private Button btnSearch;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.alert_dialog, container, false);
        btnSearch = (Button) view.findViewById(R.id.btn_search);
        btnCancel = (Button) view.findViewById(R.id.btn_cancel);
        progressBar = (ProgressBar) view.findViewById(R.id.progress_search);

        TextInputLayout inputLayout = (TextInputLayout) view.findViewById(R.id.search_input_layout);

        TextInputEditText etWord = (TextInputEditText) view.findViewById(R.id.et_word);

        etWord.addTextChangedListener(new MyTextWatcher(inputLayout, btnSearch));

        btnSearch.setOnClickListener(this);
        btnCancel.setOnClickListener(this);

        return view;
    }

    @Override
    public void dismiss() {
        if(! (progressBar.getVisibility() == View.VISIBLE)){
            super.dismiss();
        }
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        if(! (progressBar.getVisibility() == View.VISIBLE)){
            setCancelable(true);
            super.onCancel(dialog);
        }
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.btn_search:
                progressBar.setVisibility(View.VISIBLE);
                btnCancel.setEnabled(true);
                btnSearch.setEnabled(false);
                setCancelable(false);
                //Download definition in a new AsyncTask
                break;

            case R.id.btn_cancel:
                progressBar.setVisibility(View.INVISIBLE);
                //Stop the AsyncTask if is running
                dismiss();
                break;
        }
    }

    private static class MyTextWatcher implements TextWatcher{
        private TextInputLayout inputLayout;
        private Button button;

        MyTextWatcher(TextInputLayout inputLayout, Button button){
            this.inputLayout = inputLayout;
            this.button = button;
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }

        @Override
        public void afterTextChanged(Editable editable) {

            if(button.getId() == R.id.btn_search){
                if(editable.length() < 3){
                    button.setEnabled(false);
                    inputLayout.setError("Invalid Text.");
                    if(editable.length() == 0){
                        inputLayout.setError(null);
                    }
                }else{
                    button.setEnabled(true);
                    button.setVisibility(View.VISIBLE);
                    inputLayout.setError(null);
                }
            }
        }
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity{

    private MainFragmentAdapter fragmentAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initFragmentAdapter();
        initViews();
    }

    private void initFragmentAdapter(){
        fragmentAdapter = new MainFragmentAdapter(getSupportFragmentManager());

        //Add fragments here
        fragmentAdapter.addFragment(ScreenAntonimosFragment.newInstance("Example 1"));
        fragmentAdapter.addFragment(ScreenSinonimosFragment.newInstance("Example 2"));

        fragmentAdapter.addFragment(ScreenSearchFragment.newInstance("Search"));
    }

    private void initViews(){

        ViewPager viewPager = (ViewPager) findViewById(R.id.main_view_pager);
        if(viewPager != null){
            viewPager.setAdapter(fragmentAdapter);
        }

        TabLayout tabLayout = (TabLayout) findViewById(R.id.main_tab);
        if(tabLayout != null){
            tabLayout.setupWithViewPager(viewPager);
        }

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        boolean opc = false;

        if(id == R.id.action_settings){
            opc = super.onOptionsItemSelected(item);
        }
        return opc;
    }
}

    
asked by ViejoCadillac 17.10.2016 в 02:46
source

0 answers