Joseph
Joseph

Reputation: 420

App crashes on app exit if mediaplayer is not played

My app crashes on app exit. Except if the song is playing and you exit, it will never crash. But if the song is NOT playing/played and i exit the app, it will exit and crash. I kill your task in the ondestroy function the activity. Please help me.

This is the Tip1Activity.java

public class Tip1Activity extends AppCompatActivity {
    private ArrayList<Music> arrayList;
    private CustomMusicAdapter adapter;
    private RecyclerView recyclerView;


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



        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        recyclerView =  findViewById(R.id.recyclerViewList);

        arrayList = new ArrayList<>();
        arrayList.add(new Music("001 Veni, veni, Emmanuel", "SONGS OF WORSHIP", R.raw.veni_emmanuel));
        arrayList.add(new Music("002 O come. O come Emmanuel", "SONGS OF WORSHIP", R.raw.o_come_emmanuel));
        arrayList.add(new Music("003 Savior of the nations, come", "SONGS OF WORSHIP", R.raw.savior_of_nations));
        arrayList.add(new Music("004 On Jordan's bank the Baptist's cry", "SONGS OF WORSHIP", R.raw.on_jordans_bank));
        arrayList.add(new Music("005 Lo, he comes", "SONGS OF WORSHIP", R.raw.lo_he_comes));
        arrayList.add(new Music("006 O Word that goest forth on high", "SONGS OF WORSHIP", R.raw.o_word_that_goes_forth));
        arrayList.add(new Music("007 Wake, awake", "SONGS OF WORSHIP", R.raw.wake_awake));
        arrayList.add(new Music("008 Rorate caeli", "SONGS OF WORSHIP", R.raw.rorate_caeli));
        arrayList.add(new Music("009 Conditor alme siderum", "SONGS OF WORSHIP", R.raw.conditor_alme_siderum));
        arrayList.add(new Music("010 Creator of the stars of night", "SONGS OF WORSHIP", R.raw.creator_of_the_stars));



        adapter = new CustomMusicAdapter(this, R.layout.custom_music_row, arrayList);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(false);

    }



    public void onDestroy() {
        super.onDestroy();
        if( adapter !=null ){
            adapter.release();
        }
    }

    @Override
    public void onBackPressed() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Do you want to close App?")
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        Tip1Activity.this.finish();
                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });
        AlertDialog alert = builder.create();
        alert.show();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);

        MenuItem menuItem = menu.findItem(R.id.search_view);

        SearchView searchView = (SearchView) menuItem.getActionView();

        searchView.setMaxWidth(Integer.MAX_VALUE);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                adapter.getFilter().filter(newText);
                return true;
            }
        });



        return  true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){

            case R.id.item1:
                Toast.makeText(this, "Settings Selected", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(this, Main2Activity.class));
                return true;

            //DO YOUR FUNCTIONALITY HERE




            default:
                return super.onOptionsItemSelected(item);
        }

    }
}

The CustomMusicAdapter.java

public class CustomMusicAdapter extends RecyclerView.Adapter<MyViewHolder> implements Filterable {

    private Context context;
    private int layout;
    private ArrayList<Music> myArraylist;
    private ArrayList<Music> getUserModelListFiltered;
    private static MediaPlayer mediaPlayer;
    private boolean flag=true;


    public CustomMusicAdapter(Context context, int custom_music_row, ArrayList<Music> myArraylist) {
        this.context = context;
        this.layout = layout;
        this.getUserModelListFiltered = myArraylist;
        this.myArraylist = myArraylist;

    }

    public void release(){
        mediaPlayer.stop();
        mediaPlayer.release();
    }


    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        final View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.custom_music_row, parent, false);
        return new MyViewHolder(itemView);
    }



    @SuppressLint("RecyclerView")
    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
        holder.setIsRecyclable(false);

        final Music music = myArraylist.get(position);
        holder.mTitle.setText(music.getName());
        holder.mDes.setText(music.getSinger());

        //Play Music Setup
        holder.mImageaplay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (flag){
                    mediaPlayer=MediaPlayer.create(context,music.getSong());
                    flag=false;
                }
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.pause();
                    mediaPlayer.start();
                    holder.mImageaplay.setImageResource(R.drawable.ic_play);
                }else {
                    mediaPlayer.start();
                    holder. mImageaplay.setImageResource(R.drawable.ic_pause);
                }
                mediaPlayer.start();

            }
        });

        // stop player
        holder.mImageStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!flag){
                    mediaPlayer.stop();
                    mediaPlayer.release();
                    flag=true;
                }
                holder.mImageaplay.setImageResource(R.drawable.ic_play);
            }
        });

    }

    @Override
    public int getItemCount() {
        return myArraylist.size();
    }

    @Override
    public Filter getFilter() {

        Filter filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                FilterResults filterResults = new FilterResults();
                if (charSequence == null | charSequence.length() == 0){
                    filterResults.count = getUserModelListFiltered.size();
                    filterResults.values = getUserModelListFiltered;
                }else {
                    String searchChr = charSequence.toString().toLowerCase();
                    List<Music> resultData = new ArrayList<>();
                    for (Music music: getUserModelListFiltered){
                        if (music.getName().toLowerCase().contains(searchChr)){
                            resultData.add(music);
                        }
                    }
                    filterResults.count = resultData.size();
                    filterResults.values = resultData;
                }
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {

                myArraylist = (ArrayList<Music>) filterResults.values;
                notifyDataSetChanged();

            }
        };
        return filter;
    }

    public class ViewHolder {
        TextView textView_SongName, textView_artist;
        ImageView imageView_play, imageView_stop;
        private View convertview;
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

        public ViewHolder() {
            convertview = layoutInflater.inflate(layout, null);
            textView_SongName = convertview.findViewById(R.id.textName);
            textView_artist = convertview.findViewById(R.id.txtSinger);
            imageView_play = convertview.findViewById(R.id.ivPlay);
            imageView_stop = convertview.findViewById(R.id.ivStop);

        }
    }
}

This is the LogaCat

2020-06-24 12:44:35.598 27137-27137/com.josephgritchen.songsofworship E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.josephgritchen.songsofworship, PID: 27137
    java.lang.RuntimeException: Unable to destroy activity {com.josephgritchen.songsofworship/com.josephgritchen.songsofworship.Tip1Activity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.stop()' on a null object reference
        at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4425)
        at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4443)
        at android.app.ActivityThread.-wrap5(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1684)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6549)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.stop()' on a null object reference
        at com.josephgritchen.songsofworship.CustomMusicAdapter.release(CustomMusicAdapter.java:38)
        at com.josephgritchen.songsofworship.Tip1Activity.onDestroy(Tip1Activity.java:67)
        at android.app.Activity.performDestroy(Activity.java:7239)
        at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1249)
        at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4412)
        at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4443) 
        at android.app.ActivityThread.-wrap5(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1684) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6549) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888) 

This is what i did that still gave me error

// stop player
        holder.mImageStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(mediaPlayer!=null)
                {
                    if(mediaPlayer.isPlaying())
                    {
                        mediaPlayer.stop();
                        mediaPlayer.release();
                    }
                holder.mImageaplay.setImageResource(R.drawable.ic_play);
            }}

        });

    }

Upvotes: 1

Views: 143

Answers (1)

IntelliJ Amiya
IntelliJ Amiya

Reputation: 75778

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.stop()' on a null object reference

Try with

    if(mediaPlayer!=null)
    {     
      if(mediaPlayer.isPlaying())
      {
             mediaPlayer.stop();         
             mediaPlayer.release(); 
      }

  }

Upvotes: 1

Related Questions