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.