简体   繁体   中英

How can I make this code more efficient?

I'm making a Android app that basically plays video from a website on the press of a button. As you can see by the code bellow I have 8 different buttons that will play eight different videos. I'm new to programming and this all works fine but I know it's not the best way to write it.

Is there a way I can do the same thing with less lines of code?

package biz.slwdesign.tvlocallysouthdevon;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.MediaController;
import android.widget.VideoView;

public class Watch extends Activity implements OnClickListener {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
        setContentView(R.layout.watch); 

        //ImageButton1
        ImageButton video1 = (ImageButton) findViewById(R.id.ImageButton1);
        video1.setOnClickListener(this);

        //ImageButton2
        ImageButton video2 = (ImageButton) findViewById(R.id.ImageButton2);
        video2.setOnClickListener(this);

        //ImageButton3
        ImageButton video3 = (ImageButton) findViewById(R.id.ImageButton3);
        video3.setOnClickListener(this);

        //ImageButton4
        ImageButton video4 = (ImageButton) findViewById(R.id.ImageButton4);
        video4.setOnClickListener(this);

        //ImageButton5
        ImageButton video5 = (ImageButton) findViewById(R.id.ImageButton5);
        video5.setOnClickListener(this);

        //ImageButton6
        ImageButton video6 = (ImageButton) findViewById(R.id.ImageButton6);
        video6.setOnClickListener(this);

        //ImageButton7
        ImageButton video7 = (ImageButton) findViewById(R.id.ImageButton7);
        video7.setOnClickListener(this);

        //ImageButton7
        ImageButton video8 = (ImageButton) findViewById(R.id.ImageButton8);
        video8.setOnClickListener(this);

    }

    public void onClick(View v) {

        if(v.getId() == R.id.ImageButton1){
            setContentView(R.layout.watch);
            VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
            videoview1.setMediaController(new MediaController(this));
            videoview1.setVideoPath("http://slwdesign.biz/android/austins.mp4");
            videoview1.start();
            videoview1.requestFocus();
            videoview1.setOnCompletionListener(new OnCompletionListener() {           
                public void onCompletion(MediaPlayer videoview) {
                }
            });
        }
        if (v.getId() == R.id.ImageButton2){ 
            setContentView(R.layout.watch);
            VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
            videoview1.setMediaController(new MediaController(this));
            videoview1.setVideoPath("http://slwdesign.biz/android/brownsWigs.mp4");
            videoview1.start();
            videoview1.requestFocus();
        }
        if (v.getId() == R.id.ImageButton3){
            setContentView(R.layout.watch);
            VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
            videoview1.setMediaController(new MediaController(this));
            videoview1.setVideoPath("http://slwdesign.biz/android/frames&Boxes.mp4");
            videoview1.start();
            videoview1.requestFocus();
        }
        if (v.getId() == R.id.ImageButton4){
            setContentView(R.layout.watch);
            VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
            videoview1.setMediaController(new MediaController(this));
            videoview1.setVideoPath("http://slwdesign.biz/android/hatMckool.mp4");
            videoview1.start();
            videoview1.requestFocus();
        }
        if(v.getId() == R.id.ImageButton5){
            setContentView(R.layout.watch);
            VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
            videoview1.setMediaController(new MediaController(this));
            videoview1.setVideoPath("http://slwdesign.biz/android/gardenTime.mp4");
            videoview1.start();
            videoview1.requestFocus();
        }
        if (v.getId() == R.id.ImageButton6){
            setContentView(R.layout.watch);
            VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
            videoview1.setMediaController(new MediaController(this));
            videoview1.setVideoPath("http://slwdesign.biz/android/paulBarclay.mp4");
            videoview1.start();
            videoview1.requestFocus();
        }
        if (v.getId() == R.id.ImageButton7){
            setContentView(R.layout.watch);
            VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
            videoview1.setMediaController(new MediaController(this));
            videoview1.setVideoPath("http://slwdesign.biz/android/fishShed.mp4");
            videoview1.start();
            videoview1.requestFocus();
        }
        if(v.getId() == R.id.ImageButton8){
            setContentView(R.layout.watch);
            VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
            videoview1.setMediaController(new MediaController(this));
            videoview1.setVideoPath("http://slwdesign.biz/android/offBoutique.mp4");
            videoview1.start();
            videoview1.requestFocus();
        }
    }
}

in xml file,set this attribute android:onClick="onClick" instead of initialize ImageButton instance

give some advice:

1.use Map to save the id and video url.

 //init the video url map in onCreate method
videoMap = new HashMap<Integer, String>();
videoMap.put(R.id.ImageButton1, "http://slwdesign.biz/android/austins.mp4");
...

//then init the onClickListener

Set<Integer> idSets = videoMap.keySet();
for(int id:idSets){
    ImageButton button = (ImageButton)findViewById(id);
    button.setOnClickListener(this);
}

//only init once
videoview1 = (VideoView) findViewById(R.id.videoView1);

also, if you in the xml, set the android:onClick="onClick" , the loop onClickListener init can be cancel.

2.onClick method:

 //onclick 
String url = videoMap.get(v.getId());
if(url!=null){
    videoview1.setMediaController(new MediaController(this));
    videoview1.setVideoPath(url);
    videoview1.start();
    videoview1.requestFocus();
}

You can shorten your code for example that way:

Create a HashMap<Integer, String> (probably static ) that links the R.id.* to the videoPath . Then iterate over the keyset to setOnClickListener s and in onClick do a lookup of the path based on the ID.

Edit: about that way

private static final LinkedHashMap<Integer, String> ID_MAP = new LinkedHashMap<Integer, String>();
static {
    ID_MAP.put(R.id.button1, "http://video1.avi");
    ID_MAP.put(R.id.button2, "http://video2.avi");
    ID_MAP.put(R.id.button3, "http://video3.avi");
    ID_MAP.put(R.id.button4, "http://video4.avi");
    ID_MAP.put(R.id.button5, "http://video5.avi");
}

private final Button[] mButtons = new Button[ID_MAP.size()];
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int i = 0;
    for (int id : ID_MAP.keySet()) {
        mButtons[i] = (Button) findViewById(id);
        mButtons[i].setOnClickListener(this);
        i++;
    }
}
@Override
public void onClick(View v) {
    int id = v.getId();
    String url = ID_MAP.get(id);
    // set url etc
}

You can save some lines of code this way.

package biz.slwdesign.tvlocallysouthdevon;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.MediaController;
import android.widget.VideoView;

public class Watch extends Activity implements OnClickListener {

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
    setContentView(R.layout.watch);


    //ImageButton1
    ImageButton video1 = (ImageButton) findViewById(R.id.ImageButton1);
    video1.setOnClickListener(this);

    //ImageButton2
    ImageButton video2 = (ImageButton) findViewById(R.id.ImageButton2);
    video2.setOnClickListener(this);

    //ImageButton3
    ImageButton video3 = (ImageButton) findViewById(R.id.ImageButton3);
    video3.setOnClickListener(this);

    //ImageButton4
    ImageButton video4 = (ImageButton) findViewById(R.id.ImageButton4);
    video4.setOnClickListener(this);

    //ImageButton5
    ImageButton video5 = (ImageButton) findViewById(R.id.ImageButton5);
    video5.setOnClickListener(this);

    //ImageButton6
    ImageButton video6 = (ImageButton) findViewById(R.id.ImageButton6);
    video6.setOnClickListener(this);

    //ImageButton7
    ImageButton video7 = (ImageButton) findViewById(R.id.ImageButton7);
    video7.setOnClickListener(this);

    //ImageButton7
    ImageButton video8 = (ImageButton) findViewById(R.id.ImageButton8);
    video8.setOnClickListener(this);

}

public void onClick(View v) {

    setContentView(R.layout.watch);
    VideoView videoview1 = (VideoView) findViewById(R.id.videoView1);
    videoview1.setMediaController(new MediaController(this));
    if(v.getId() == R.id.ImageButton1){
    videoview1.setVideoPath("http://slwdesign.biz/android/austins.mp4");
    }
    if (v.getId() == R.id.ImageButton2){ 
    videoview1.setVideoPath("http://slwdesign.biz/android/brownsWigs.mp4");
    }
    if (v.getId() == R.id.ImageButton3){
    videoview1.setVideoPath("http://slwdesign.biz/android/frames&Boxes.mp4");
    }
    if (v.getId() == R.id.ImageButton4){
    videoview1.setVideoPath("http://slwdesign.biz/android/hatMckool.mp4");
    }
    if(v.getId() == R.id.ImageButton5){
    videoview1.setVideoPath("http://slwdesign.biz/android/gardenTime.mp4");
    }
    if (v.getId() == R.id.ImageButton6){
    videoview1.setVideoPath("http://slwdesign.biz/android/paulBarclay.mp4");
    }
    if (v.getId() == R.id.ImageButton7){
    videoview1.setVideoPath("http://slwdesign.biz/android/fishShed.mp4");
    }
    if(v.getId() == R.id.ImageButton8){
    videoview1.setVideoPath("http://slwdesign.biz/android/offBoutique.mp4");
    }
    videoview1.start();
    videoview1.requestFocus();
}

Hope I haven't overlooked something.

Definitely the best way is to define the On Click in the layout XML, you have to write an On Click method for every button this way for me is more clear than the lot of conditional, then never write the same lines of code twice or more group them in a method, then call the method from where is needed.

I´d rather use switch, case for your type of code instead of the if statment. Regards.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM