Android 活动在奇怪的延迟后显示

Android 活动在奇怪的延迟后显示,android,android-activity,delay,Android,Android Activity,Delay,我在android应用程序项目中启动活动时遇到了延迟 每当单击菜单项或可单击视图时,onClickListener只会创建一个新的意图并启动指定的活动。到目前为止还可以。但是,视图会被冻结一段明显的时间(大约1秒),直到用户看到新的活动 这个时间可能是由onCreate内部的进度造成的,但我通过System.currentTimeMillis()测量了时间,并在最后用logcat打印了它。因此,似乎只需要20-30毫秒,而且日志在用户看到活动之前很久就被打印出来了 这是我的密码: public

我在android应用程序项目中启动活动时遇到了延迟

每当单击菜单项或可单击视图时,onClickListener只会创建一个新的意图并启动指定的活动。到目前为止还可以。但是,视图会被冻结一段明显的时间(大约1秒),直到用户看到新的活动

这个时间可能是由onCreate内部的进度造成的,但我通过System.currentTimeMillis()测量了时间,并在最后用logcat打印了它。因此,似乎只需要20-30毫秒,而且日志在用户看到活动之前很久就被打印出来了

这是我的密码:

public class ExampleActivity extends MyActivity {

    MyModel myModel;
    long startTime;


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startTime = System.currentTimeMillis();
        setContentView(R.layout.activity_ders_programi);
        setToolbar();

        myModel = Controller.getMyModel();
        if(myModel == null) { //If we don't have the object previously
            //this fills the object, takes some time
            myModel = new MyModel(this);
            //myModel is observable and this activity is observer.
            //Whenever it's done, it notifies this activity
        }
        else //If we got the object previously
            createCardViews();
        Controller.setMyModel(myModel);

        setParentActivity();
    }


    //If Observable object notifies this activity, update() is called.
    @Override
    public void update(Observable observable, Object o) {
        createCardViews();
    }


   //Creating a list of cardViews, this also takes some time
   private void createCardViews() {
       ArrayList<Card> cards = new ArrayList<Card>();
       for(int i = 0; i < 5; i++) {
           MyModelCardModel card = new MyModelCardModel(this, i);
           card.init();
           cards.add(card);
       }

       CardArrayAdapter mCardArrayAdapter = new CardArrayAdapter(this,cards);

       CardListView listView = (CardListView) findViewById(R.id.my_card_list_view);
       if (listView!=null)
           listView.setAdapter(mCardArrayAdapter);

       //I think here is the last point.
       //After this point there will be no significant process.
       long stopTime = System.currentTimeMillis();
       Log.d("modelflow", "card create takes: " + (stopTime - startTime) + "ms");

}
公共类ExampleActivity扩展了MyActivity{
MyModel MyModel;
长启动时间;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
startTime=System.currentTimeMillis();
setContentView(R.layout.activity\u ders\u programi);
setToolbar();
myModel=Controller.getMyModel();
如果(myModel==null){//如果我们以前没有对象
//这会填充对象,需要一些时间
myModel=新的myModel(此);
//myModel是可观察的,此活动是可观察的。
//无论何时完成,它都会通知此活动
}
否则//如果我们之前得到了对象
createCardViews();
Controller.setMyModel(myModel);
setParentActivity();
}
//若可观察对象通知此活动,则调用update()。
@凌驾
公共无效更新(可观察,对象o){
createCardViews();
}
//创建CardView列表也需要一些时间
私有void createCardViews(){
ArrayList cards=新的ArrayList();
对于(int i=0;i<5;i++){
MyModelCardModel卡=新的MyModelCardModel(此,i);
init();
卡片。添加(卡片);
}
CardArrayAdapter mCardArrayAdapter=新的CardArrayAdapter(此为卡);
CardListView listView=(CardListView)findViewById(R.id.my\u card\u list\u view);
如果(listView!=null)
setAdapter(mCardArrayAdapter);
//我想这是最后一点。
//在这一点之后,将不会有任何重要的过程。
长停止时间=System.currentTimeMillis();
Log.d(“modelflow”,“卡片创建时间:”+(stopTime-startTime)+“ms”);
}

那么我做错了什么呢?如果延迟是因为进度太大,那么为什么测量的时间看起来很少。比如说进度导致延迟,为什么应用程序在显示活动后不等待?以及如何避免这种情况?

有一个项目,与polymer+xwalk相比,测试本机应用程序的性能。你可以在这里找到来源
此项目证明本机应用程序的性能要好得多,但启动活动和GC的延迟是显而易见的。此外,了解GC如何导致fps下降也很有趣。

您的问题是Controller.SetMyModel()或setParentActivity()

为什么我要把范围缩小到那些

  • 除了那两个电话,你什么都要计时
  • 一切似乎都进展得很快
  • 这两个非定时调用都没有源代码
  • 这些调用似乎不适用于具有已知行为的Android方法
  • 根据您对Controller.SetMyModel()的描述

    实际上只不过是一个基本的设定者


    最有可能的候选者是setParentActivity()。你应该发布它的源代码。

    这次你是如何测量的?这是一个调试版本吗?你在调试模式下测量时间吗?什么是操作系统版本和设备型号?@ViktorYakunin正如你在上面的代码中所看到的,我使用了两个变量,分别名为startTime和stopTime。最后,我将它们之间的差异打印到logcat上。我没有使用调试模式。应用程序在我自己的手机三星Galaxy S4上运行,操作系统是安卓4.4.2。但emulator中存在同样的问题,Nexus S和安卓5.0尝试将密集的处理代码转移到另一个生命周期方法中-可能是
    onResume()
    ,然后查看延迟是否消失。@Safa Kadir您的问题并不明显,以防万一,调试版本没有优化,与发布版本相比执行得很差。@nightfixed记得我已经尝试过,延迟没有消失。但它是在一些更改之前出现的。我会再试一次。