我在Android应用程序中有一段代码,这是Runnable的一个实现。
在我的方法void run()
的实现中,我在Runnable实现之外调用了Activity本身的一个函数。
代码如下:
Message msg = Message.obtain(null, Communicator.MSG_REFRESH_ASSIGNED_LOCATIONS,
new Runnable() {
@Override
public void run() {
Cursor assignedLocations = getAssignedLocations();
assignedLocations.moveToFirst(); //EXCEPTION HERE! NULL POINTER EXCEPTION!!
if(!assignedLocations.isAfterLast()) {
//some code
} else {
//some code
}
}
});
该函数为getAssignedLocations()
,它将查询中的Cursor返回给sqlite。
getAssignedLocations()
函数有效,从Runnable实现外部调用时不返回null(意思是来自onResume或onCreate)。
以下是getAssignedLocations()
的代码:
/**
* returns a cursor for all assigned locations in the local database
* @return
*/
protected Cursor getAssignedLocations() {
return getAssignedLocations(null);
}
/**
* returns a cursor from the database with only one entry of which the loc_id is specificLoaction
* if specificLocation is null, returns all assigned locations from the database
* @param specificLocation
* @return
*/
private Cursor getAssignedLocations(String specificLocation) {
SQLiteDatabase db = personalLocations.getReadableDatabase();
String[] projection = {
FeedEntry.COLUMN_NAME_LOC_ID,
FeedEntry.COLUMN_NAME_LOC_NAME
};
String orderBy =
FeedEntry.COLUMN_NAME_LOC_NAME + " DESC";
if(specificLocation == null) {
Cursor c = db.query(FeedEntry.TABLE_NAME, projection, null, null, null, null, orderBy);
return c;
}
String[] arguments = {specificLocation};
Cursor c = db.query(FeedEntry.TABLE_NAME, projection, FeedEntry.COLUMN_NAME_LOC_ID + "=?", arguments, null, null, orderBy);
return c;
}
任何人都可以解释为什么我得到一个空指针异常?是否将非静态函数传递给Runnable接口并不起作用?
答案 0 :(得分:0)
感谢sethro的大力帮助,我们一起想出错误是代码的另一部分,甚至没有包含在问题中。
我使用了错误的Message.obtain方法,因此将Runnable实现放在Message.obj而不是Message.getCallback()中。因此,当我调用它来获取服务中的Runnable时,它返回null。空指针异常实际上来自那里。
对于未来的人来说,当你使用message.obtain时,这可能需要注意。它的某些变体接受Object
,因此当你在那里放置错误的参数时,它不会警告你。
C ++程序员可能会因为遇到问题而嘲笑我们: - )