我正在开发我的第一个 android 应用程序,我正在尝试使用 Quickblox.com 作为我的后端。
为了使用它,我需要通过使用他们的 SDK 创建会话来授权应用程序。
所以,我有以下代码:
// Initialize QuickBlox application with credentials.
QBSettings.getInstance().fastConfigInit(Consts.APP_ID, Consts.AUTH_KEY, Consts.AUTH_SECRET);
// Authorize application
QBAuth.createSession(new QBCallback() {
@Override public void onComplete(Result result) {}
@Override
public void onComplete(Result result, Object context) {
if (result.isSuccess()) {
showMainScreen();
} else {
// print errors that came from server
Toast.makeText(getBaseContext(), result.getErrors().get(0), Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.INVISIBLE);
}
}
}, QBQueries.QB_QUERY_AUTHORIZE_APP);
此代码适用于模拟器,但如果我尝试使用真正的安卓手机,它就不起作用。我有一个连接超时错误。我想我需要在后台发出这种请求(Web 服务),对吧?
所以我尝试使用 AsyncTask 在后台向 QB 发出请求,并将代码更改为:
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
// Initialize QuickBlox application with credentials.
QBSettings.getInstance().fastConfigInit(Consts.APP_ID, Consts.AUTH_KEY, Consts.AUTH_SECRET);
// Authorize application
QBAuth.createSession(new QBCallback() {
@Override public void onComplete(Result result) {}
@Override
public void onComplete(Result result, Object context) {
if (result.isSuccess()) {
showMainScreen();
} else {
// print errors that came from server
Toast.makeText(getBaseContext(), result.getErrors().get(0), Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.INVISIBLE);
}
}
}, QBQueries.QB_QUERY_AUTHORIZE_APP);
return null;
}
}.execute();
我在这里看到了很多类似的问题,但我似乎找不到适用于我的代码的答案。我看到处理UI的函数需要从主线程调用,所以我想我里面的代码
onComplete(Result result, Object context)
应该在这样的块内吗?
runOnUiThread(new Runnable()
{
public void run()
{
// code here
}
});
但我也试过了,但没有用。有什么猜测吗?
我相信问题不是因为 Toast 和 showMainScreen()。这段代码仍然失败:
// Initialize QuickBlox application with credentials.
QBSettings.getInstance().fastConfigInit(Consts.APP_ID, Consts.AUTH_KEY, Consts.AUTH_SECRET);
QBAuth.createSession(new QBCallback() {
@Override
public void onComplete(Result arg0, Object arg1) {
// TODO Auto-generated method stub
}
@Override
public void onComplete(Result arg0) {
// TODO Auto-generated method stub
}
}, QBQueries.QB_QUERY_AUTHORIZE_APP);
但是,如果我只创建 QBCallback 对象,而不将其传递给 QBAuth.createSession 函数,它不会失败。