问题
public class MainActivity extends AppCompatActivity {
public static String TAG ="TAG";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//四行重复代码
Log.d(TAG, "onCreate: ");
Log.d(TAG, "onCreate: ");
Log.d(TAG, "onCreate: ");
Log.d(TAG, "onCreate: ");
}
}
如果用Android8.0系统执行上述代码,会只有两行输出,debug的话四行都会输出。改成for循环的重复输出也是同样的,只输出两行就停止输出了。
问题发现
我在复习RxJava的操作符的时候,测试了这么段代码
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
}
}).map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Exception {
return "result " + integer;
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.d(TAG, s);
}
});
按理说应该输出0 1 2 三次,我发现随便怎么搞,在同一线程里,我都无法完整输出。然后我切换线程又可以执行。
然后我就找了半天Rxjava的问题,发现并不是。我发现只要改成不一样的代码就可以执行,而且只要在相同的代码超过两行再插入一行不同的代码,也可以执行,所以我试着把代码移除来在onCreate中执行,发现也是一样的,所以排除了Rxjava的原因。
那难道是编译器原因?我更新了也没用,最后没办法,让朋友帮忙测试下,发现别人的可以,而环境与我不同的只有模拟器他是低于Android8.0的,于是我自己重新装了个7.0的模拟器,可以顺利运行。我又测试了其他几台机器,也是一样。
我有点纳闷了,这难道是Android8.0的优化么,可能是我学识不够。我个人觉得这样的优化未免太激进了,只要相同的代码超过两行就不执行了,这有点扯犊子了,debug下又可以运行。找了很多原因也难找到。