从runnable调用函数

时间:2014-07-02 21:49:20

标签: java android sqlite

我在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接口并不起作用?

1 个答案:

答案 0 :(得分:0)

感谢sethro的大力帮助,我们一起想出错误是代码的另一部分,甚至没有包含在问题中。

我使用了错误的Message.obtain方法,因此将Runnable实现放在Message.obj而不是Message.getCallback()中。因此,当我调用它来获取服务中的Runnable时,它返回null。空指针异常实际上来自那里。

对于未来的人来说,当你使用message.obtain时,这可能需要注意。它的某些变体接受Object,因此当你在那里放置错误的参数时,它不会警告你。

C ++程序员可能会因为遇到问题而嘲笑我们: - )