对于InstrumentedCursorWrapper.java下函数
@Override
public boolean moveToPosition(int position) {
boolean result = super.moveToPosition(position);
logQueryTime();
return result;
}
super执行的是父类的方法
public boolean moveToPosition(int position) {
return mCursor.moveToPosition(position);
}
这里的mCursor为 private Cursor mCursor;
public interface Cursor {
boolean moveToPosition(int position);
}
那么moveToPosition这个方法在哪里实现呢?
以下为模拟片段;
@Override
public boolean moveToPosition(int position) {
boolean result = super.moveToPosition(position);
logQueryTime();
return result;
}
super执行的是父类的方法
public boolean moveToPosition(int position) {
return mCursor.moveToPosition(position);
}
这里的mCursor为 private Cursor mCursor;
public interface Cursor {
boolean moveToPosition(int position);
}
那么moveToPosition这个方法在哪里实现呢?
mCursor回归到AbstractCursor实现的方法。
AbstractCursor.java
public abstract class AbstractCursor implements CrossProcessCursor {
public final boolean moveToPosition(int position) {
// Make sure position isn't past the end of the cursor
final int count = getCount();
if (position >= count) {
mPos = count;
return false;
}
// Make sure position isn't before the beginning of the cursor
if (position < 0) {
mPos = -1;
return false;
}
// Check for no-op moves, and skip the rest of the work for them
if (position == mPos) {
return true;
}
boolean result = onMove(mPos, position);
if (result == false) {
mPos = -1;
} else {
mPos = position;
if (mRowIdColumnIndex != -1) {
mCurrentRowID = Long.valueOf(getLong(mRowIdColumnIndex));
}
}
return result;
}
}
public interface CrossProcessCursor extends Cursor {
}
public interface Cursor {
boolean moveToPosition(int position);
}
以下为模拟片段;
package com.jk.test.cursor;
public interface Cursor {
boolean moveToPosition(int position);
}
package com.jk.test.cursor;
public interface CrossProcessCursor extends Cursor {
}
package com.jk.test.cursor;
public abstract class AbstractCursor implements CrossProcessCursor {
@Override
public boolean moveToPosition(int position) {
System.out.println("position " + position);
return false;
}
}
package com.jk.test.model;
import com.jk.test.cursor.AbstractCursor;
import com.jk.test.cursor.Cursor;
public class RealModel extends AbstractCursor {
private Cursor mCursor;
public boolean onMove(int oldPosition, int newPosition)
{
if(mCursor==null){
mCursor = new RealModel();
}
mCursor.moveToPosition(newPosition - oldPosition);
return true;
}
}
package com.jk.test;
import com.jk.test.model.RealModel;
public class CursorTest {
/**
* @param args
*/
public static void main(String[] args) {
RealModel rm = new RealModel();
rm.onMove(0, 2);
}
}