我一直在测试android中的一些asynctasks。在AsyncTask中嵌套/正常for循环
但我发现有些不合逻辑的结果对这些代码:
int a1Sum = 0;
int a2Sum = 0;
long a1Time = 0;
long a2Time = 0;
private class Async1 extends AsyncTask<Void, Void, String> {
protected void onPreExecute() {
a1Time = System.currentTimeMillis();
}
protected String doInBackground(Void... arg0) {
for (int i = 0; i < 10000; i++) {
publishProgress();
}
return "You are at PostExecute";
}
protected void onProgressUpdate(Void... arg0) {
a1Sum++;
}
protected void onPostExecute(String result) {
Log.d("A1 Time", String.valueOf(System.currentTimeMillis() - a1Time)); // records the executing time
AsyncTask async2 = new Async2().execute();
}
}
private class Async2 extends AsyncTask<Void, Void, String> {
protected void onPreExecute() {
a2Time = System.currentTimeMillis();
}
protected String doInBackground(Void... arg0) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
for (int l = 0; l < 10; l++) {
publishProgress();
}
}
}
}
return "You are at PostExecute";
}
protected void onProgressUpdate(Void... arg0) {
a2Sum++;
}
protected void onPostExecute(String result) {
Log.d("A2 Time", String.valueOf(System.currentTimeMillis() - a2Time)); // records the executing time
}
}
这两个asynctasks做同样的工作,但这里是不合逻辑的部分:
,你在代码中看到,a1Time
和a2Time
记录执行时间,这里是他们的结果:
D/A1 Time: 1025
D/A2 Time: 768
D/A1 Time: 1022
D/A2 Time: 716
D/A1 Time: 1017
D/A2 Time: 729
D/A1 Time: 1063
D/A2 Time: 830
D/A1 Time: 1059
D/A2 Time: 784
我的问题是:是什么让Async2
跑得快吗?
@ Kaushal28但不应该'Async1'更快,因为它更简单? –
有趣。现在转身。让线程1由线程2启动。 – greenapps
如果'''''''''''''''''''''''''''''''''Async2''的实现和Aynsc1'完全相同,它会以相同的方式结束结果还是会有相同的执行时间?当代码在主UI线程和后台线程之间切换时会更好地剖析执行时间,这会增加开销,因此需要跟踪doInBackground()实现的时间。我认为他们会以接近的执行时间结束。最后,(我可能要求太多,道歉),如果使用'executeOnExecutor(THREAD_POOL_EXECUTOR)''而不是''execute()''',它会一样吗? – ahasbini