1
\$\begingroup\$

This is my first time building an Android app or even using Java in the first place. All of this code does work, but I'm hoping to optimize it or find out if things could be done more easily than how I've done them.

radio.java

package com.example.jacob.wutk;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;

public class radio extends AppCompatActivity {

    private MediaPlayer mediaPlayer;
    private boolean isMediaPlayerStarted = false;

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

    public void setMediaPlayer() {
        try {
            mediaPlayer = new MediaPlayer();
            String url = "http://streamer.cci.utk.edu:8000/wutk-vorbis"; // your URL here

            final ImageButton imb = (ImageButton) findViewById(R.id.playPause);

            imb.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (!isMediaPlayerStarted) {
                        mediaPlayer.prepareAsync();
                        isMediaPlayerStarted = true;
                    } else {
                        if (mediaPlayer.isPlaying()) {
                            imb.setImageResource(R.drawable.play1);
                            mediaPlayer.pause();
                        } else {
                            imb.setImageResource(R.drawable.pause1);
                            mediaPlayer.start();
                        }
                    }
                }
            });

            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                public void onPrepared(MediaPlayer mediaPlayer){
                    mediaPlayer.start();
                }
            });

            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setDataSource(url);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }}

activity_radio.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    tools:context="com.example.jacob.wutk.radio">
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="left|center_vertical"
        android:scaleType="centerCrop"
        android:src="@drawable/background_mic1"/>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingBottom="1.0dip"
        android:paddingLeft="4.0dip"
        android:paddingRight="4.0dip"
        android:paddingTop="5.0dip">
       <ImageButton
           android:id="@+id/playPause"
           android:layout_width="0.0dip"
           android:layout_height="wrap_content"
           android:layout_weight="1.0"
           android:background="?android:selectableItemBackground"
           android:clickable="true"
           android:scaleType="fitCenter"
           android:onClick="playPauseMusic"
           android:src="@drawable/play1"/>
       <ImageView
           android:layout_width="0.0dip"
           android:layout_height="fill_parent"
           android:layout_marginRight="5dp"
           android:layout_weight="1.0"
           android:background="?android:selectableItemBackground"
           android:scaleType="fitCenter"
           android:src="@drawable/logo"/>

    </LinearLayout>

</FrameLayout>

Debug version of app

\$\endgroup\$
2
\$\begingroup\$

There's really not a lot going on in what you've posted, so there's not much to pick apart. Really the only functional change I'd mention is that there's a MediaController class available that you can use that provides play, pause, and seek functionality (including a standard UI that Android users are familiar with) that you might want to check out. That said, it's 100% find to use your own UI if that's a design decision and not just the result of being unaware. Also, you don't update the play/pause UI the first time the `MediaPlayer is started. Other than that, it's mostly code style and convention issues that I see.

  1. Classes are usually named using PascalCase (you have lowercase). Also, convention is to use the word "Activity" when extending an Activity, so your radio class should probably be RadioActivity.

  2. The prefix set is generally reserved for setter methods - methods that update a variable value and often do some pre- or post-processing work around that update. I would probably call setMediaPlayer something like initializeMediaPlayer or startMediaPlayer.

  3. You could break setMediaPlayer into multiple smaller methods.

  4. You probably don't want that whole method body in the try block - figure out what's going to potentially throw and move the rest out. This is a bit of a nitpick and isn't critical for a fairly small function like this, but it's a good habit to get into.

  5. imb is a bad variable name - it's not clear what kind of object is being referenced.

  6. Your code might be a little easier to read with less nesting. I'd probably move the functionality in the onClick to its own method, and call that method in the onClick.

  7. Why is the imb variable final and not a member variable? It's OK to do this, but there doesn't seem to be clear reason - you're using member variables elsewhere.

  8. Again, not a critical issue, but Android convention is to prefix private variables with m, so mediaPlayer would become mMediaPlayer.

  9. Why is setMediaPlayer public? Always be as restrictive as possible.

  10. isMediaPlayerStarted will default to false so you don't need to set it.

  11. If an error is thrown, do you really want to print the stack trace? This might be fine if that's what you want, but I suspect that's either the IDE's decision or the result of a copy/paste... What error might be thrown here? What could be a possible source? What do you really want to do if that happens?

  12. If you're not using any ImageButton methods, you don't need to cast it - findViewById returns a View, which has a setOnClickListener method, so the cast doesn't do anything.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.