非 UI 线程中的游标提取性能



我在AsyncTaskLoader中从游标获取数据时遇到了性能问题。在安卓 API 级别 10 中进行测试。例如 2 个带有游标的类 - TestFragmentUI在 UI 线程中获取数据,TestFragment在无UI thread中获取数据。

public class TestFragment extends Fragment implements LoaderManager.LoaderCallbacks<Object> {
...
@Override
public void onActivityCreated(Bundle savedInstanceState) {
...
getLoaderManager().initLoader(0, null, this);
...
}
public android.support.v4.content.Loader<Object> onCreateLoader(
            int id, Bundle args) {
    return new Loader(getActivity());
}
class Loader extends AsyncTaskLoader<Object> {

    public Loader(Context context) {
        super(context);     
    }
    public Object loadInBackground() {
        ...
        DataBaseHelper helper = new DataBaseHelper(getContext());
        SQLiteDatabase database = helper.getReadableDatabase();
        long start = System.currentTimeMillis();
        Cursor data = database.rawQuery(String.format(SQL_LOAD, parametr), null);
        while (data.moveToNext()) {
            String number = data.getString(data.getColumnIndex("number"));
        }
        data.close();       
        Log.i(TAG, "load: " + (System.currentTimeMillis() - start));
        ... 
    }
}
...
}

public class TestFragmentUI extends Fragment {
...
@Override
public void onActivityCreated(Bundle savedInstanceState) {
...
DataBaseHelper helper = new DataBaseHelper(getActivity());
SQLiteDatabase database = helper.getReadableDatabase();
...
long start = System.currentTimeMillis();
Cursor data = database.rawQuery(String.format(SQL_LOAD, parametr), null);
while (data.moveToNext()) {
String number = data.getString(data.getColumnIndex("number"));
}
data.close();
Log.i(TAG, "load: " + (System.currentTimeMillis() - start));
...
}
...
}

在模拟器中TestFragment类输出时间比输出TestFragmentUI慢 10 倍,并且在视觉上非常明显。

有什么想法吗?

真实设备(您的手机(上使用它进行测试,因为模拟器很慢

答案是更改后台进程优先级(Process.setThreadPriority(,因为默认情况下AsyncTask以后台优先级运行。

最新更新