Java – The project runs slowly

The project runs slowly… here is a solution to the problem.

The project runs slowly

I’m working on an app that is interested in guitar chords in Android Studio. There are 2 spinners to select chords, and there is an ImageView to display chord diagrams on the screen. When the user selects a chord, its graph appears on the screen and plays. Unfortunately it’s really slow. How can I make it faster?
This is the Java class

public class Chords extends ActionBarActivity implements AdapterView.OnItemSelectedListener {

String[] notes = {"A", "B", "C","C#","D", "E", "F","F#", "G"};
    String[] mode = {"m", "m7", "5", " ", "7M", "dim", "aug", "sus2"};
    Spinner sp;
    Spinner spinner2;
    TextView textView;
    TextView t;
    TextView t2;
    MediaPlayer mySound,mySound2,mySound3,mySound4,mySound5,mySound6,mySound7;
    private static ImageView imgView;
    int[] images = {R.drawable.aminor,R.drawable.eminor,R.drawable.a_major,R.drawable.cmajor,R.drawable.gmajor,R.drawable.dminor,R.drawable.bminor};
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.chords_screen);
        textView = (TextView) findViewById(R.id.textView);
        sp = (Spinner) findViewById(R.id.spinner);
        spinner2 = (Spinner) findViewById(R.id.spinner2);
        t2=(TextView) findViewById(R.id.textView2);
        creating adapter
        ArrayAdapter<String> adapter_state = new ArrayAdapter<String>(this, android. R.layout.simple_spinner_item, notes);
        ArrayAdapter<String> adapter_state2 = new ArrayAdapter<String>(this, android. R.layout.simple_spinner_item, mode);

setting drop down list type
        adapter_state.setDropDownViewResource(android. R.layout.simple_spinner_dropdown_item);
        adapter_state2.setDropDownViewResource(android. R.layout.simple_spinner_dropdown_item);

setting adapter to spinner
        sp.setAdapter(adapter_state);
        spinner2.setAdapter(adapter_state2);

setting listener to spinner
        sp.setOnItemSelectedListener(this);
        spinner2.setOnItemSelectedListener(this);
    }

@Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        imgView = (ImageView) findViewById(R.id.imageView);
        mySound = MediaPlayer.create(this, R.raw.am);
        mySound2 = MediaPlayer.create(this, R.raw.em);
        mySound3 = MediaPlayer.create(this, R.raw.amajor);
        mySound4 = MediaPlayer.create(this, R.raw.cmajor);
        mySound5 = MediaPlayer.create(this, R.raw.gmajor);
        mySound6 = MediaPlayer.create(this, R.raw.dminor);
        mySound7 = MediaPlayer.create(this, R.raw.bm);

if (sp.getSelectedItemPosition() == 0 && spinner2.getSelectedItemPosition() == 0) {
            mySound.start();
            imgView.setImageResource(images[0]);
        }
        if (sp.getSelectedItemPosition() == 0 && spinner2.getSelectedItemPosition() == 3) {
            mySound3.start();
            imgView.setImageResource(images[2]);
        }
        if (sp.getSelectedItemPosition() == 1 && spinner2.getSelectedItemPosition() == 0) {
            mySound7.start();
            imgView.setImageResource(images[6]);
        }
        if (sp.getSelectedItemPosition() == 2 && spinner2.getSelectedItemPosition() == 3) {
            mySound4.start();
            imgView.setImageResource(images[3]);
        }
        if (sp.getSelectedItemPosition() == 4 && spinner2.getSelectedItemPosition() == 0) {
            mySound6.start();
            imgView.setImageResource(images[5]);
        }
        if (sp.getSelectedItemPosition() == 5 && spinner2.getSelectedItemPosition() == 0) {
            mySound2.start();
            imgView.setImageResource(images[1]);
        }
        if (sp.getSelectedItemPosition() == 8 && spinner2.getSelectedItemPosition() == 3) {
            mySound5.start();
            imgView.setImageResource(images[4]);
        }
    }
    public void onNothingSelected(AdapterView<?> parent) {
         TODO Auto-generated method stub

}
}

Solution

mySound = MediaPlayer.create(this, R.raw.am);
mySound2 = MediaPlayer.create(this, R.raw.em);
mySound3 = MediaPlayer.create(this, R.raw.amajor);
mySound4 = MediaPlayer.create(this, R.raw.cmajor);
mySound5 = MediaPlayer.create(this, R.raw.gmajor);
mySound6 = MediaPlayer.create(this, R.raw.dminor);
mySound7 = MediaPlayer.create(this, R.raw.bm);

Don’t do it. Create 1 media player. MediaPlayer is a huge object, and creating 7 of them is very painful and slow. Instead of even creating a new one on every click, it should be created in your oncreate, but create a new set of data sources.

Related Problems and Solutions