我正在尝试使用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线程。它不在AsyncTask
或onPostExecute
中。它位于onProgressExecute
,它不应该阻止用户界面。
另一方面,删除循环仍会阻止UI线程
doInBackground
这些简单的调用阻止了UI线程,应用程序停止响应。
答案 0 :(得分:2)
这会阻止你的UI线程:
while(time == -1);
您应该通过回调处理成功/失败,而不是这样做。如果pubnub API采用这样的回调,它看起来好像已经在后台线程上处理它。只需在回调处理程序中采取适当的操作。
答案 1 :(得分:0)
while(time == -1);
这一行阻止你的UI线程,因为这个指针永远不会被其他线程更新,它不是一个易变的变量。 您可以使用Debug Bottle检测项目中的UI Block代码。