我是AspectJ的新手,尽管我多年来都知道这种AOP方法。 现在,这是我第一次在我的Android应用上使用它,并且想问几个关于它的问题。
我有Java代码:
private void mainView() {
... (some code)
<A>
setContentView(R.layout.main);
mView = findViewById(R.id.Main_Root);
mView.setOnTouchListener(this);
<B>
... (some code)
}
我有以下AspectJ代码:
public aspect mainViewTiming {
pointcut callSetContentViewTiming():
call(* android.app.Activity.setContentView(..))
&& withincode(void mainView(..))
;
pointcut callFindViewById():
call(* android.app.Activity.findViewById(..))
&& withincode(void mainView(..))
;
pointcut callSetOnTouchListener():
call (* android.view.View.setOnTouchListener(..))
&& withincode(void mainView(..))
;
}
现在我的问题是如何使用AspectJ并计算从中运行所需的时间?
我有3个切入点,我想知道将它们组合起来产生这种效果的最佳方法是什么?从这个链接我了解到我可以使用“cflow”: http://www.eclipse.org/aspectj/doc/released/progguide/language-joinPoints.html
before(): cflow(callSetContentViewTiming()) && cflow(callFindViewById()) && callSetOnTouchListener() {
start = System.currentTimeMillis();
}
但我不确定这是否正确。如何计算组合切入点之间和之间的差异。是否有类似“after()”的东西?
先谢谢。
答案 0 :(得分:0)
是的,有一个“after()”。但我不确定你是否正确使用cflow。 cflow意味着控制流程。这是一个切入点,只要某个切入点在堆栈上就会命中。每当你进入一个方法调用(在方法调用中,在方法调用中)与其他切入点匹配时。
这里你想要的是在第一个方法调用之前设置start并在最后一个方法调用之后设置end。中间方法调用无关紧要,所以我删除了那个切入点。
public aspect MainViewTiming {
pointcut mainView() : withincode(void mainView(..));
pointcut callSetContentViewTiming() :
call(* android.app.Activity.setContentView(..)) && mainView();
pointcut callSetOnTouchListener() :
call (* android.view.View.setOnTouchListener(..)) && mainView();
before() : callSetContentViewTiming() {
start = System.currentTimeMillis();
}
after() : callSetOnTouchListener() {
end = System.currentTimeMillis();
}
}
请注意,此方面只有一个实例。