异步Pubnub调用阻止android ui线程

时间:2016-02-04 19:19:23

标签: android multithreading android-asynctask pubnub

我正在尝试使用time方法从pubnub获取服务器时间

mPubnub.time(callback);

我想这是一个异步调用然后我就有一个等待循环,所以我可以等待结果

time = -1;
mPubnub.time(callback);
while(time == -1);

在回电中我有

Callback callback = new Callback() {
    public void successCallback(String channel, Object response) {
        try {
            JSONArray jsonArray = new JSONArray(response.toString());
            time = jsonArray.getLong(0) / 10000;
            return;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        time = 0;
    }

    public void errorCallback(String channel, PubnubError error) {
        Log.wtf("error/" + channel, error.toString());
        time = 0;
    }
};

所有这些来自doInBackground的{​​{1}}。为什么它会阻止我的ui线程。同时调用发布也阻止了我的UI线程,我只能从AsyncTask

调用它们

很多人说while循环阻止了UI线程,但我不明白为什么AsyncTask中的循环会阻塞UI线程。它不在AsyncTaskonPostExecute中。它位于onProgressExecute,它不应该阻止用户界面。

另一方面,删除循环仍会阻止UI线程

doInBackground

这些简单的调用阻止了UI线程,应用程序停止响应。

2 个答案:

答案 0 :(得分:2)

这会阻止你的UI线程:

while(time == -1);

您应该通过回调处理成功/失败,而不是这样做。如果pubnub API采用这样的回调,它看起来好像已经在后台线程上处理它。只需在回调处理程序中采取适当的操作。

答案 1 :(得分:0)

  

while(time == -1);

这一行阻止你的UI线程,因为这个指针永远不会被其他线程更新,它不是一个易变的变量。 您可以使用Debug Bottle检测项目中的UI Block代码。