Start Activity is slow and the new activity is empty

Question

This is my first android app, I'm transitioning from iOS development. I'm trying to change to a different activity. However, it takes multiple seconds (about 3) for my new empty activity to appear.

Here is my code to send to transition to the new activity:

public void openStats(View v) {
    startActivity(new Intent(MainActivity.this, StatsActivity.class));
}

Here is my onCreate of my new activity:

public class StatsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.stats_page);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

I can't figure out why this is taking so long? I'm testing on a Samsung Galaxy S5 also.

This is the log when opening the new activity:

D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1
I/Timeline: Timeline: Activity_launch_request id:com.example.NAME.reflexmath time:53311650
W/ResourcesManager: getTopLevelResources:/data/app/APPNAME2/base.apk / 1.0 running in APPNAME rsrc of package null
D/SecWifiDisplayUtil: Metadata value : none
D/ViewRootImpl: #1 mView = com.android.internal.policy.PhoneWindow$DecorView{a1db7f7 I.E...... R.....ID 0,0-0,0}
D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 72 - 0, 0) vi=Rect(0, 72 - 0, 0) or=1
W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView)
I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@58ff7f6 time:53313401

And stats_page.xml:

<LinearLayout 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:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:baselineAligned="false" 
android:orientation="vertical" 
android:background="@android:color/holo_blue_light"> 

<LinearLayout 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="0dp" 
android:layout_weight="0.1"></LinearLayout> 

<LinearLayout 
android:layout_width="fill_parent" 
android:layout_height="0dp" 
android:layout_weight="0.8"> 

<ImageView 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
app:srcCompat="@drawable/reflexmath5" 
android:id="@+id/imageView10" 
android:layout_weight="1" 
android:layout_gravity="center" 
android:cropToPadding="false" 
android:adjustViewBounds="false" 
android:scaleType="fitCenter" /> 
</LinearLayout> 

<LinearLayout 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="0dp" 
android:layout_weight="0.1"></LinearLayout> 

<LinearLayout 
android:layout_width="fill_parent" 
android:layout_height="0dp" 
android:layout_weight="0.7" 
android:orientation="horizontal" 
android:layout_marginLeft="15dp" 
android:layout_marginRight="15dp" 
android:weightSum="1" 
android:id="@+id/progView"> 

<ImageView 
android:layout_width="0dp" 
android:layout_height="match_parent" 
app:srcCompat="@drawable/hbmlogo" 
android:id="@+id/imageView11" 
android:elevation="1dp" 
android:layout_weight="0.3" 
android:scaleType="fitCenter" /> 

<ProgressBar 
style="@style/Widget.AppCompat.ProgressBar.Horizontal" 
android:layout_height="match_parent" 
android:id="@+id/xpBar" 
android:scaleY="5" 
android:progress="50" 
android:layout_weight="0.7" 
android:layout_width="0dp" 
android:layout_marginLeft="-13dp" /> 
</LinearLayout> 

<LinearLayout 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="0dp" 
android:layout_weight="0.25"> 

<TextView 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:gravity="center" 
android:text="HIGH SCORE 3456" 
android:textColor="@android:color/background_light" 
android:textSize="1sp" 
android:id="@+id/highScoreLbl" /> 
</LinearLayout> 

<LinearLayout 
android:layout_width="fill_parent" 
android:layout_height="0dp" 
android:layout_weight="1" > 

<ImageButton 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
app:srcCompat="@drawable/play" 
android:id="@+id/imageButton9" 
android:layout_weight="1" 
android:scaleType="fitCenter" 
android:background="@android:color/transparent" /> 

<ImageButton 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
app:srcCompat="@drawable/stats" 
android:id="@+id/imageButton10" 
android:layout_weight="1" 
android:scaleType="fitCenter" 
android:background="@android:color/transparent" 
android:onClick="openStats" /> 
</LinearLayout> 

<LinearLayout 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="0dp" 
android:layout_weight="0.1"></LinearLayout> 

<LinearLayout 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="0dp" 
android:layout_weight="0.4"> 

<ImageButton 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
app:srcCompat="@drawable/audioon" 
android:id="@+id/imageButton12" 
android:layout_weight="1" 
android:background="@android:color/transparent" 
android:scaleType="fitCenter" /> 

<ImageButton 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
app:srcCompat="@drawable/adson" 
android:id="@+id/imageButton13" 
android:layout_weight="1" 
android:background="@android:color/transparent" 
android:scaleType="fitCenter" /> 
</LinearLayout> 

<LinearLayout 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="0dp" 
android:layout_weight="0.1"></LinearLayout> 

</LinearLayout>

Show source
| android   | performance   2016-12-30 22:12 3 Answers

Answers to Start Activity is slow and the new activity is empty ( 3 )

  1. 2016-12-31 00:12

    The only thing that was making the app slow was an 1200x1200 image that was being scaled down to a size of roughly 200x200. When I removed this, the entire app worked fast again. Is this a common occurrence? Can android not handle down scaling very well? Anyway, Thanks for the help!

  2. 2016-12-31 00:12

    Using big images and allowing the system to scale them will be memory intensive and therefore slow on some/most devices.

    You should provide the correct size images for the screen size available, this way the least scaling is needed.

    Read more here: https://developer.android.com/guide/practices/screens_support.html

  3. 2016-12-31 01:12

    In order to fix slow image loading from resource, I use a custom view that uses Glide image loading library to show the images.

    public class GlideImageView
            extends ImageView {
        public GlideImageView(Context context) {
            super(context);
            init(context, null, -1);
        }
    
        public GlideImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context, attrs, -1);
        }
    
        public GlideImageView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(context, attrs, defStyleAttr);
        }
    
        @TargetApi(21)
        public GlideImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
            init(context, attrs, defStyleAttr);
        }
    
        int drawableResource = 0;
    
        private void init(Context context, AttributeSet attributeSet, int defStyle) {
            TypedArray a = null;
            if(defStyle != -1) {
                a = getContext().obtainStyledAttributes(attributeSet, R.styleable.GlideImageView, defStyle, 0);
            } else {
                a = getContext().obtainStyledAttributes(attributeSet, R.styleable.GlideImageView);
            }
            drawableResource = a.getResourceId(0, 0);
            a.recycle();
    
            ViewUtils.waitForMeasure(this, new ViewUtils.OnMeasuredCallback() {
                @Override
                public void onMeasured(View view, int width, int height) {
                    if(!isInEditMode()) {
                        if(drawableResource != 0) {
                            Glide.with(getContext()).load(drawableResource).dontAnimate().into(GlideImageView.this);
                        }
                    } else {
                        setImageResource(drawableResource);
                    }
                }
            });
        }
    }
    

    and

    public final class ViewUtils {
        public interface OnMeasuredCallback {
            void onMeasured(View view, int width, int height);
        }
    
        public static void waitForMeasure(final View view, final OnMeasuredCallback callback) {
            int width = view.getWidth();
            int height = view.getHeight();
    
            if (width > 0 && height > 0) {
                callback.onMeasured(view, width, height);
                return;
            }
    
            view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                @Override public boolean onPreDraw() {
                    final ViewTreeObserver observer = view.getViewTreeObserver();
                    if (observer.isAlive()) {
                        observer.removeOnPreDrawListener(this);
                    }
    
                    callback.onMeasured(view, view.getWidth(), view.getHeight());
    
                    return true;
                }
            });
        }
    
        private ViewUtils() {
        }
    }
    

    and

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="GlideImageView">
            <attr name="image_resource" format="integer"/>
        </declare-styleable>
    </resources>
    

    And then can be used as

            <the.package.GlideImageView
                    android:id="@+id/image"
                    android:layout_width="120dp"
                    android:layout_height="120dp"
                    app:image_resource="@drawable/image"/>
    

    Using the dependency

    compile('com.github.bumptech.glide:glide:3.7.0') {
        exclude group: 'com.android.support', module: 'appcompat'
        exclude group: 'com.android.support', module: 'support-v4'
    }
    

Leave a reply to - Start Activity is slow and the new activity is empty

◀ Go back