Android 活动在奇怪的延迟后显示
我在android应用程序项目中启动活动时遇到了延迟 每当单击菜单项或可单击视图时,onClickListener只会创建一个新的意图并启动指定的活动。到目前为止还可以。但是,视图会被冻结一段明显的时间(大约1秒),直到用户看到新的活动 这个时间可能是由onCreate内部的进度造成的,但我通过System.currentTimeMillis()测量了时间,并在最后用logcat打印了它。因此,似乎只需要20-30毫秒,而且日志在用户看到活动之前很久就被打印出来了 这是我的密码:Android 活动在奇怪的延迟后显示,android,android-activity,delay,Android,Android Activity,Delay,我在android应用程序项目中启动活动时遇到了延迟 每当单击菜单项或可单击视图时,onClickListener只会创建一个新的意图并启动指定的活动。到目前为止还可以。但是,视图会被冻结一段明显的时间(大约1秒),直到用户看到新的活动 这个时间可能是由onCreate内部的进度造成的,但我通过System.currentTimeMillis()测量了时间,并在最后用logcat打印了它。因此,似乎只需要20-30毫秒,而且日志在用户看到活动之前很久就被打印出来了 这是我的密码: public
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() 为什么我要把范围缩小到那些
最有可能的候选者是setParentActivity()。你应该发布它的源代码。这次你是如何测量的?这是一个调试版本吗?你在调试模式下测量时间吗?什么是操作系统版本和设备型号?@ViktorYakunin正如你在上面的代码中所看到的,我使用了两个变量,分别名为startTime和stopTime。最后,我将它们之间的差异打印到logcat上。我没有使用调试模式。应用程序在我自己的手机三星Galaxy S4上运行,操作系统是安卓4.4.2。但emulator中存在同样的问题,Nexus S和安卓5.0尝试将密集的处理代码转移到另一个生命周期方法中-可能是
onResume()
,然后查看延迟是否消失。@Safa Kadir您的问题并不明显,以防万一,调试版本没有优化,与发布版本相比执行得很差。@nightfixed记得我已经尝试过,延迟没有消失。但它是在一些更改之前出现的。我会再试一次。