图像沉重的MainActivity落后于三星GS7,但不是古老的手机

时间:2016-10-03 19:48:00

标签: android imageview

我的主要活动的布局主要由用作按钮的图像组成。使用Percent Relative Layout

将图像缩小到适当的大小

图像本身是我的drawable文件夹中的.png文件。我们假设它们是压缩格式,每个大约120到140kb。

我认为这与屏幕上的太多图像同时存在,但很奇怪发现当装载在一台屏幕尺寸只有我的三星GS7的3岁设备上时,它可以使用最小的滞后。 logcat甚至几乎没有任何帧率跳过。

目前的理论是,更高分辨率的屏幕可能会吸引更多资源,但GS7上的内存应该使旧设备相形见绌。

另外,仿真器就像垃圾一样运行。比任何物理设备慢100倍,所以我不打扰它。

以编程方式,唯一发生的事情是每个onClickListener ImageView。页面上没有其他工作要做。

XML     

        <android.support.percent.PercentRelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:text="@string/abc"
                android:textSize="27sp"
                android:id="@+id/textMainTitle"
                android:layout_gravity="center"
                android:layout_alignParentTop="true"
                android:textColor="#ffffff"
                android:gravity="center_horizontal" />

            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:text="def"
                android:id="@+id/textMainSubTitle"
                android:layout_gravity="center_horizontal"
                android:layout_below="@id/textMainTitle"
                android:gravity="center_horizontal" />


            <ImageView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:id="@+id/btn1"
                android:src="@drawable/1"
                app:layout_widthPercent="33%"
                android:layout_below="@id/textMainSubTitle"
                android:adjustViewBounds="true"
            />

            <ImageView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:id="@+id/btn2"
                android:src="@drawable/2"
                app:layout_widthPercent="33%"
                android:layout_below="@id/textMainSubTitle"
                android:layout_toRightOf="@id/btn1"
                android:adjustViewBounds="true"
                />

            <ImageView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:id="@+id/btn3"
                android:src="@drawable/3"
                app:layout_widthPercent="33%"
                android:layout_below="@id/textMainSubTitle"
                android:layout_toRightOf="@id/btn2"
                android:adjustViewBounds="true"
                />

 // Other buttons removed. But there are six rows each with
 // 3 button as there are above

相关Java

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        btn1 = (ImageView) findViewById(R.id.btn1);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(getApplicationContext(), activity1.class));
            }
        });

        btn2 = (ImageView) findViewById(R.id.btn2);
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(getApplicationContext(), activity2.class));
            }
        });

        btn3 = (ImageView) findViewById(R.id.btn3);
        btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(getApplicationContext(), activity2.class));
            }
        });

 //As in the XML layout, all other buttons have been removed for visual

logcat的

I/Choreographer: Skipped 31 frames!  The application may be doing too much work on its main thread.
I/Choreographer: Skipped 38 frames!  The application may be doing too much work on its main thread.

//and so on.

感谢任何建议或协助。谢谢

3 个答案:

答案 0 :(得分:1)

在主线程上加载所有这些图像是不好的。您应该异步加载它们。使用图片加载库,例如GlidePicasso。它们通常用于从远程源下载和显示图像,但它们也可以很好地处理本地异步加载。

让我们为btn1执行异步图片加载。使用Glide(因为这是我最喜欢的),它可能不容易:

Glide.with(this) // any Context subclass, depending on lifecycle needs .load(R.drawable.1) .into(btn1)

为所有ImageViews执行此操作,您就是金色的。不要忘记删除android:src = ... xml属性。

至于模拟器的迟缓,如果您使用的是Windows和支持VT的Intel CPU,请从SDK管理器下载并安装“Intel x86 Emulator Accelerator(HAXM安装程序)”。确保在BIOS中启用了VT-x。

答案 1 :(得分:0)

这就是为什么在主线程上加载图像是个坏主意的原因。屏幕将滞后(或跳过帧)。考虑到您加载的图像数量,图像大小为120kb(每个)太多了。

将图像保存在服务器上并使用异步任务检索它们。

答案 2 :(得分:0)

 startActivity(new Intent(getApplicationContext(), activity1.class));

to 

 startActivity(new Intent(ActivityName.this, activity1.class));

//与其他两项活动相同!