Android 调用函数时 SQLite Cursor 变慢
Android SQLite Cursor slow when calling function
我在 MotoG 2nd Gen (1GB RAM, Quad-core 1.2 GHz)
中测试了我的应用程序。我在 class Misc
中有以下静态方法。 itemRates
数组是长度为 132 的 Object
数组,包含长度约为 50 个字符的字符串:-
public static double getDCRate(String item){
for(int i=0;i<itemRates.length;i++){
String ar[] = (itemRates[i]+"").split("[;]");
if(ar[0].equals(item)){
return Double.parseDouble(ar[1]);
}
}
return 0;
}
现在,在我的 AsyncTask
中,我调用这个函数如下所示:-
/* db initialized */
Cursor c = db.rawQuery(sql, null);
if (c.moveToFirst()) {
do {
/* ... */
double totalCost = 0.0;
double ntwt_double = c.getDouble(c.getColumnIndex("Ntwt"));
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN1")))*(c.getDouble(c.getColumnIndex("DP1"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN2")))*(c.getDouble(c.getColumnIndex("DP2"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN3")))*(c.getDouble(c.getColumnIndex("DP3"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN4")))*(c.getDouble(c.getColumnIndex("DP4"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN5")))*(c.getDouble(c.getColumnIndex("DP5"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN6")))*(c.getDouble(c.getColumnIndex("DP6"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN7")))*(c.getDouble(c.getColumnIndex("DP7"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN8")))*(c.getDouble(c.getColumnIndex("DP8"))/100)*ntwt_double;
完成 AsyncTask
大约需要 12 秒..嗯?!对于迭代一个小数组来说相当大。为了检查它是否是函数调用,我删除了函数调用以发现 AsyncTask
在大约 1 秒内完成!需要注意的一点是,我在我的 swing 应用程序中使用了相同的代码行,它也是一个 Java 框架。那么为什么在android中执行要花这么多时间呢?知道如何解决这个难题吗?
感谢@matiash,我分析了该方法并发现 split(..)
是罪魁祸首。不知道为什么,但是 split
、Patter.splitter
.. 和其他方法占总计算时间的 52%。奇怪的是,在使用 split
的替代品后,AsyncTask
会在大约 2 秒内加载。
我在 MotoG 2nd Gen (1GB RAM, Quad-core 1.2 GHz)
中测试了我的应用程序。我在 class Misc
中有以下静态方法。 itemRates
数组是长度为 132 的 Object
数组,包含长度约为 50 个字符的字符串:-
public static double getDCRate(String item){
for(int i=0;i<itemRates.length;i++){
String ar[] = (itemRates[i]+"").split("[;]");
if(ar[0].equals(item)){
return Double.parseDouble(ar[1]);
}
}
return 0;
}
现在,在我的 AsyncTask
中,我调用这个函数如下所示:-
/* db initialized */
Cursor c = db.rawQuery(sql, null);
if (c.moveToFirst()) {
do {
/* ... */
double totalCost = 0.0;
double ntwt_double = c.getDouble(c.getColumnIndex("Ntwt"));
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN1")))*(c.getDouble(c.getColumnIndex("DP1"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN2")))*(c.getDouble(c.getColumnIndex("DP2"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN3")))*(c.getDouble(c.getColumnIndex("DP3"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN4")))*(c.getDouble(c.getColumnIndex("DP4"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN5")))*(c.getDouble(c.getColumnIndex("DP5"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN6")))*(c.getDouble(c.getColumnIndex("DP6"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN7")))*(c.getDouble(c.getColumnIndex("DP7"))/100)*ntwt_double;
totalCost += Misc.getDCRate(c.getString(c.getColumnIndex("DN8")))*(c.getDouble(c.getColumnIndex("DP8"))/100)*ntwt_double;
完成 AsyncTask
大约需要 12 秒..嗯?!对于迭代一个小数组来说相当大。为了检查它是否是函数调用,我删除了函数调用以发现 AsyncTask
在大约 1 秒内完成!需要注意的一点是,我在我的 swing 应用程序中使用了相同的代码行,它也是一个 Java 框架。那么为什么在android中执行要花这么多时间呢?知道如何解决这个难题吗?
感谢@matiash,我分析了该方法并发现 split(..)
是罪魁祸首。不知道为什么,但是 split
、Patter.splitter
.. 和其他方法占总计算时间的 52%。奇怪的是,在使用 split
的替代品后,AsyncTask
会在大约 2 秒内加载。