这是我的第一个Android应用程序,我正在从iOS开发过渡。 我正在尝试改变其他活动。但是,我的新空活动需要几秒钟(大约3秒)才能显示。
以下是我要转发到新活动的代码:
public void openStats(View v) {
startActivity(new Intent(MainActivity.this, StatsActivity.class));
}
以下是我的新活动:
public class StatsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.stats_page);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
我无法弄清楚为什么这么长时间?我也正在测试三星Galaxy S5。
这是打开新活动时的日志:
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
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>
答案 0 :(得分:2)
使用大图像并允许系统缩放它们将占用大量内存,因此在某些/大多数设备上会很慢。
您应该为可用的屏幕尺寸提供正确尺寸的图像,这样就需要最小的缩放。
在此处阅读更多内容:https://developer.android.com/guide/practices/screens_support.html
答案 1 :(得分:1)
使应用程序变慢的唯一原因是1200x1200图像缩小到大约200x200的大小。当我删除它时,整个应用程序再次运行得很快。这是常见的事吗? android能不能很好地处理缩放?不管怎样,谢谢你的帮助!
答案 2 :(得分:1)
为了从资源中修复慢速图像加载,我使用一个自定义视图,使用Glide图像加载库来显示图像。
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);
}
}
});
}
}
和
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() {
}
}
和
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="GlideImageView">
<attr name="image_resource" format="integer"/>
</declare-styleable>
</resources>
然后可以用作
<the.package.GlideImageView
android:id="@+id/image"
android:layout_width="120dp"
android:layout_height="120dp"
app:image_resource="@drawable/image"/>
使用依赖
compile('com.github.bumptech.glide:glide:3.7.0') {
exclude group: 'com.android.support', module: 'appcompat'
exclude group: 'com.android.support', module: 'support-v4'
}