Search code examples
androidimageviewscrollviewlag

Scrolling in my app is really not smooth


I made an android app that plays sounds when clicking the button. These sounds can be also shared via messenger. All of these buttons (their look and position) are specified in activity_main.xml. The problem is, when I scroll up or down in my app, it looks terrible, because it's not smooth and my app seems to be laggy.

Here's my code with some buttons and imageviews for example

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/r1">

    <Button
        android:text="@string/sound1"
        android:layout_marginTop="33dp"
        android:id="@+id/sound1"
        android:layout_width="210dp"
        android:background="@drawable/backgroundbuttons"
        android:layout_height="50dp"
        android:layout_alignRight="@+id/sound3"
        android:layout_alignEnd="@+id/sound3"
        android:textSize="13sp" />

    <Button
        android:text="@string/sound2"
        android:layout_width="210dp"
        android:layout_height="50dp"
        android:layout_marginTop="8dp"
        android:id="@+id/sound2"
        android:background="@drawable/backgroundbuttons"
        android:layout_below="@+id/sound1"
        android:layout_alignLeft="@+id/sound1"
        android:layout_alignStart="@+id/sound1"
        android:textSize="13sp" />

    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        app:srcCompat="@drawable/sharebutton"
        android:id="@+id/share_button1"
        android:layout_alignBottom="@+id/sound1"
        android:layout_toRightOf="@+id/sound1"
        android:layout_toEndOf="@+id/sound1" />

    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        app:srcCompat="@drawable/sharebutton"
        android:id="@+id/share_button2"
        android:layout_alignBottom="@+id/sound2"
        android:layout_toRightOf="@+id/sound2"
        android:layout_toEndOf="@+id/sound2" />

There are in total 25 buttons and 25 imageviews in my activity_main that look like this. All of these imageviews are based on one file (sharebutton.jpg).

EDIT: Main Activity class:

public class MainActivity extends AppCompatActivity {

private MediaPlayer mp;

private MessengerThreadParams mThreadParams;
private boolean mPicking;

private static final int REQUEST_CODE_SHARE_TO_MESSENGER = 1;

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

    Button s1 = (Button) findViewById(R.id.sound1);
    Button s2 = (Button) findViewById(R.id.sound2);
    findViewById(R.id.share_button1).setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v){
            onMessengerButtonClicked1();
        }

    });

    findViewById(R.id.share_button2).setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v){
            onMessengerButtonClicked2();
        }

    });

    Intent intent = getIntent();
    if (Intent.ACTION_PICK.equals(intent.getAction())) {
        mThreadParams = MessengerUtils.getMessengerThreadParamsForIntent(intent);
        mPicking = true;
    }

    s1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            onPause();
            mp = MediaPlayer.create(MainActivity.this, R.raw.a1);
            mp.start();
        }

    });


    s2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            onPause();
            mp = MediaPlayer.create(MainActivity.this, R.raw.a2);
            mp.start();
        }

private void onMessengerButtonClicked1() {
    // The URI can reference a file://, content://, or android.resource.
    Uri uri =
            Uri.parse("android.resource://" + getPackageName()+ "/raw/" +R.raw.a1);

    ShareToMessengerParams shareToMessengerParams =
            ShareToMessengerParams.newBuilder(uri, "audio/mpeg")
                    .setMetaData("{ \"audio\" : \"a1\" }")
                    .build();

if (mPicking) {
    MessengerUtils.finishShareToMessenger(this, shareToMessengerParams);
    } else {
    MessengerUtils.shareToMessenger(
            this,
            REQUEST_CODE_SHARE_TO_MESSENGER,
            shareToMessengerParams);
    }
}
private void onMessengerButtonClicked2() {
    Uri uri =
            Uri.parse("android.resource://" + getPackageName()+ "/raw/" +R.raw.a2);

    ShareToMessengerParams shareToMessengerParams =
            ShareToMessengerParams.newBuilder(uri, "audio/mpeg")
                    .setMetaData("{ \"audio\" : \"a2\" }")
                    .build();

    if (mPicking) {
        MessengerUtils.finishShareToMessenger(this, shareToMessengerParams);
    } else {
        MessengerUtils.shareToMessenger(
                this,
                REQUEST_CODE_SHARE_TO_MESSENGER,
                shareToMessengerParams);
    }
}
protected void onPause() {
    super.onPause();
    if (mp != null) {
        mp.stop();
        mp.release();
        mp = null;
    }
}

Solution

  • https://developer.android.com/guide/components/activities/activity-lifecycle.html

    Above is a general outline that can be used in broad areas including your situation.

    As for your code you can implement the following:

     @Override
        public void onResume() {
            mp.onResume();
            // Setup the player
            mp.resume();
        }
    @Override
        public void onDestroy() {
            if(mp != null) {
                mp.release();
            }
            super.onDestroy();
        }
     s1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(mp != null)
    
                    {
                        mp.stop();
                        mp.release();
                    }
                    finish();
                }
            });
    }
    

    If it helps, use logs to help you see the lifecycle

    try{
        if(mp !=null && mp.isPlaying()){
           Log.d("TAG------->", "player is running");
           mp.stop();
           Log.d("Tag------->", "player is stopped");
           mp.release();
           Log.d("TAG------->", "player is released");
        }
    }catch(Exception e){
       //Throw the error
    }