Android:DDP回调挂起app的setRefreshing(false)

时间:2014-11-13 17:29:47

标签: android meteor refresh swiperefreshlayout ddp

以下是代码:

 public void onRefresh() {
    MyDDPState.getInstance().getItems(null, new DDPListener() {
        @Override
        public void onResult(Map<String, Object> json) {

            Log.d(TAG, "refreshed");
            if (json.get("result") == null) {
/*
 * Result is null action
 */
                Log.d(TAG, "Null");
                swipeLayout.setRefreshing(false);
                return;
            }
            List<Map<String, Object>> temp = (ArrayList) json.get("result");
            Log.d(TAG, temp.toString());
            MyDDPState.getInstance().initItems(temp);

            Log.d(TAG, "converted" + MyDDPState.getInstance().getItems().toString());

            Log.d(TAG, swipeLayout.toString());
            Log.d(TAG, "Finished refreshing");

            swipeLayout.setRefreshing(false);

            Log.d(TAG, "Refresh closed");
        }
    });

}

swipeLayout指的是包含SwipeRefreshLayout的类中的私有变量。在回调中,我尝试调用setrefreshing(false)来摆脱进度指示器,但是这个调用会挂起异步函数。除“刷新已关闭”日志外,所有其他日志都有效。

出于某种原因,我认为由于我正在使用的库,DDP侦听器内部的错误也没有被记录,因此我无法跟踪它。在DDP调用之外调用时,swipeLayout.setRefreshing工作正常。

1 个答案:

答案 0 :(得分:0)

无论如何,我设法解决了这个问题。

当我尝试更改ui变量时,该函数将停止运行。

原来问题是我在错误的线程上更改了UI变量。要修复它,您必须通过调用:

在ui线程内进行UI调用
activity.runOnUiThread(new Runnable() {
    @Override
    public void run () {
        /* 
         * UI code
         */
    }
});

此处有更多信息:http://developer.android.com/tools/testing/activity_testing.html