获取聊天对话框登录聊天Quickblox后 [英] Get chat dialogs after login to chat Quickblox
问题描述
我试图调用一个方法上QBChatService成功地登录后拿到聊天对话框,但是当我这样做,它会触发onError方法,即获取对话框工作正常,如果我单独调用它的方法。这里是我的code:
公共类ChatService { 公共静态最终诠释AUTO_ preSENCE_INTERVAL_IN_SECONDS = 30;
私有静态ChatService实例;
私人QBChatService qbChatService;
私人的ArrayList< QBUser> opponentsUsers =新的ArrayList< QBUser>();
私人地图<名单,LT;整数>中QBDialog> chatDialogsHashMap =新的HashMap<名单,LT;整数>中QBDialog>();
私人的ArrayList< QBDialog> chatDialogsArrayList =新的ArrayList< QBDialog>(); 私人ConnectionListener chatConnectionListener =新ConnectionListener(){
@覆盖
公共无效连接(XMPPConnection连接){
Log.w(聊天服务,连接);
} @覆盖
公共无效认证(XMPPConnection连接){
Log.w(聊天服务,验证);
} @覆盖
公共无效connectionClosed(){
Log.w(聊天服务,connectionClosed);
} @覆盖
公共无效connectionClosedOnError(最终例外五){
Log.w(聊天服务,connectionClosedOnError:+ e.getLocalizedMessage());
} @覆盖
公共无效reconnectingIn(最终诠释秒){
如果(秒%5 == 0){
Log.w(聊天服务,reconnectingIn:+秒);
}
} @覆盖
公共无效reconnectionSuccessful(){
Log.w(聊天服务,reconnectionSuccessful);
} @覆盖
公共无效reconnectionFailed(最终异常错误){
Log.w(聊天服务,reconnectionFailed:+ error.getLocalizedMessage());
}
}; 公共ChatService(){
this.qbChatService = QBChatService.getInstance();
this.qbChatService.addConnectionListener(this.chatConnectionListener);
} 公共静态同步ChatService的getInstance(){
如果(例如== NULL){
例如=新ChatService();
}
返回实例;
} 公共静态布尔initializedIfNeeded(上下文的背景下){
如果(!QBChatService.isInitialized()){
QBChatService.init(上下文);
QBChatService.setDebugEnabled(真);
Log.w(INITIALIZED QBCHAT,成功);
返回true;
}
返回false;
} 公共无效loginToChat(){
QBAuth.getSession(新QBEntityCallbackImpl< QBSession>(){
@覆盖
公共无效的onSuccess(QBSession qbSession,捆绑软件包){
Log.w(GET SESSION,成功);
QBUser currentSessionUser =新QBUser();
currentSessionUser.setId(qbSession.getUserId());
currentSessionUser.setLogin(MenuActivity.shared preferences.getString(USERNAME,));
currentSessionUser.setPassword(MenuActivity.shared preferences.getString(密码,));
ChatService.this.qbChatService.login(currentSessionUser,新QBEntityCallbackImpl(){
@覆盖
公共无效的onSuccess(){
Log.w(登录聊天,成功);
ChatService.this.storeChatDialogs();
尝试{
ChatService.this.qbChatService.startAutoSend presence(AUTO_ preSENCE_INTERVAL_IN_SECONDS);
}赶上(SmackException.NotLoggedInException E){
e.printStackTrace();
} } @覆盖
公共无效onerror的(名单列表){
Log.w(登录聊天,ERROR);
}
});
}
@覆盖
公共无效onerror的(名单<串GT;名单){
Log.w(GET SESSION,ERROR);
}
});
} 公共无效createPrivateDialog(最终活动活动,QBDialog dialogToCreate){
。this.qbChatService.getGroupChatManager()createDialog(dialogToCreate,新QBEntityCallbackImpl< QBDialog>(){
@覆盖
公共无效的onSuccess(QBDialog qbDialog,捆绑软件包){
Log.w(创建对话框,成功);
((MenuActivity)活性).changeDialog(qbDialog);
} @覆盖
公共无效onerror的(名单<串GT;名单){
Log.w(创建对话框,EXITO);
}
});
} 公共无效storeChatDialogs(){
QBChatService.getChatDialogs(QBDialogType.PRIVATE,新QBRequestGetBuilder(),新QBEntityCallbackImpl< ArrayList的< QBDialog>>(){
@覆盖
公共无效的onSuccess(ArrayList的< QBDialog> qbDialogs,捆绑软件包){
Log.w(Store聊天对话,成功);
ArrayList的< QBDialog> dialogsFromCurrentUser =新的ArrayList< QBDialog>();
对于(QBDialog对话:qbDialogs){
ArrayList的<整数GT; occupantsIDs = dialog.getOccupants();
对于(整数ID:occupantsIDs){
如果(ChatService.getInstance()。getCurrentChatUser()。的getId()== ID.intValue()){
dialogsFromCurrentUser.add(对话);
}
}
}
ChatService.this.storeOpponentsUsersOfPrivateDialogs(dialogsFromCurrentUser);
ChatService.this.setChatDialogsHashMap(dialogsFromCurrentUser);
ChatService.this.setChatDialogsArrayList(dialogsFromCurrentUser);
} @覆盖
公共无效onerror的(名单<串GT;名单){
Log.w(Store聊天对话,ERROR);
}
});
} 公共QBUser getCurrentChatUser(){
返回this.qbChatService.getUser();
} 公共整数getOpponentIDForPrivateDialog(QBDialog对话){
整数opponentID = 0;
对于(整数用户名:dialog.getOccupants()){
如果(!userID.equals(getCurrentChatUser()。的getId())){
opponentID =用户ID;
}
}
返回opponentID;
} 公共无效storeOpponentsUsersOfPrivateDialogs(ArrayList的< QBDialog> privateDialogs){
this.opponentsUsers.clear();
QBUsers.getUsersByIDs(this.getOpponentsIDsOfPrivateDialogs(privateDialogs),新QBPagedRequestBuilder(),新QBEntityCallbackImpl< ArrayList的< QBUser>>(){
@覆盖
公共无效的onSuccess(ArrayList的< QBUser> qbUsers,捆绑软件包){
Log.w(GET用户可以通过IDS,成功);
ChatService.this.opponentsUsers = qbUsers;
} @覆盖
公共无效onerror的(名单<串GT;名单){
Log.w(GET用户可以通过IDS,ERROR);
}
});
} 公众的ArrayList<整数GT; getOpponentsIDsOfPrivateDialogs(ArrayList的< QBDialog> privateDialogs){
ArrayList的<整数GT; opponentsIDs =新的ArrayList<整数GT;();
对于(QBDialog对话:privateDialogs){
ArrayList的<整数GT; occupantsIDs = dialog.getOccupants();
对于(整数ID:occupantsIDs){
如果(this.getCurrentChatUser()。的getId()!= ID.intValue()){
opponentsIDs.add(ID);
}
}
}
返回opponentsIDs;
} 公共QBDialog getDialog(列表<整数GT; occupantsIDs){
返回this.chatDialogsHashMap.get(occupantsIDs);
} 公众的ArrayList< QBDialog> getChatDialogsArrayList(){
返回this.chatDialogsArrayList;
} 公共无效setChatDialogsArrayList(列表< QBDialog>对话框){
this.chatDialogsArrayList.clear();
对于(QBDialog对话:对话){
this.chatDialogsArrayList.add(对话);
}
} 公共地图<名单,LT;整数>中QBDialog> getChatDialogsHashMap(){
返回this.chatDialogsHashMap;
} 公共无效setChatDialogsHashMap(列表< QBDialog>对话框){
this.chatDialogsHashMap.clear();
对于(QBDialog对话:对话){
this.chatDialogsHashMap.put(dialog.getOccupants(),对话);
}
} 公共无效setAndRefreshAdapter(上下文的背景下,ListView控件dialogsList){
ArrayList的<串GT; opponentsNames =新的ArrayList<串GT;();
对于(QBUser opponentUser:this.opponentsUsers){
opponentsNames.add(opponentUser.getLogin());
Log.w(设置适配器,opponentUser.getLogin());
}
ArrayAdapter<串GT;适配器=新ArrayAdapter<串GT;(上下文,R.layout.option_player,R.id.textView_PlayersFragment_textOption,opponentsNames);
dialogsList.setAdapter(适配器);
}
}
它不显示任何错误,但我在这里把logcat的:
07-28 17:06:59.217 28003-28003 / com.example.jozumaster.myapplication W / INITIALIZED QBCHAT:成功
07-28 17:06:59.630 28003-28051 / com.example.jozumaster.myapplication E / NativeCrypto:SSL = 0x6186c9d8 cert_verify_callback x509_store_ctx = 0x625de940 ARG =为0x0
07-28 17:06:59.630 28003-28051 / com.example.jozumaster.myapplication E / NativeCrypto:SSL = 0x6186c9d8 cert_verify_callback调用verifyCertificateChain authMethod = DHE_RSA
07-28 17:07:00.027 28003-28003 / com.example.jozumaster.myapplication W / CREATE SESSION:成功
07-28 17:07:08.832 28003-28522 / com.example.jozumaster.myapplication E / NativeCrypto:SSL = 0x61d0bdb0 cert_verify_callback x509_store_ctx = 0x64cf6940 ARG =为0x0
07-28 17:07:08.832 28003-28522 / com.example.jozumaster.myapplication E / NativeCrypto:SSL = 0x61d0bdb0 cert_verify_callback调用verifyCertificateChain authMethod = DHE_RSA
07-28 17:07:08.970 28003-28003 / com.example.jozumaster.myapplication W / dalvikvm:VFY:无法解析虚方法457:Landroid /内容/ RES / TypedArray; .getChangingConfigurations()我
07-28 17:07:08.971 28003-28003 / com.example.jozumaster.myapplication W / dalvikvm:VFY:无法解析虚方法479:Landroid /内容/ RES / TypedArray; .getType(我)我
07-28 17:07:09.415 28003-28529 / com.example.jozumaster.myapplication E / NativeCrypto:SSL = 0x615d1a88 cert_verify_callback x509_store_ctx = 0x64ef2940 ARG =为0x0
07-28 17:07:09.415 28003-28529 / com.example.jozumaster.myapplication E / NativeCrypto:SSL = 0x615d1a88 cert_verify_callback调用verifyCertificateChain authMethod = DHE_RSA
07-28 17:07:09.506 28003-28003 / com.example.jozumaster.myapplication W /登入:成功
07-28 17:07:09.852 28003-28003 / com.example.jozumaster.myapplication W / GET SESSION:成功
07-28 17:07:10.314 28003-28538 / com.example.jozumaster.myapplication W /聊天服务:连接
07-28 17:07:11.008 28003-28538 / com.example.jozumaster.myapplication W /聊天服务:验证
07-28 17:07:11.011 28003-28538 / com.example.jozumaster.myapplication W / LOGIN聊天:成功
07-28 17:07:11.017 28003-28538 / com.example.jozumaster.myapplication W / LOGIN聊天:ERROR
我找到了解决办法,所以我张贴在这里,以帮助谁具有同样的问题我其他人。
回调从Quickblox工程上的辅助线程所以如果你想调用一个创建另一个辅助线程的方法,你需要让你需要创建从 UI线程做Handler对象与UI线程连接,Quickblox回调使这个自动的。问题是,辅助线程没有默认情况下,消息队列(处理程序队列)(UI线程做),你必须用尺蠖类来创建它。 活套| Android的德韦
下面是code工作:
公共无效loginToChat(最终QBUser currentSessionUser){
QBChatService.getInstance()。登录(currentSessionUser,新QBEntityCallbackImpl(){
@覆盖
公共无效的onSuccess(){
尺蠖prepare()。
Log.w(登录聊天,成功);
尝试{
QBChatService.getInstance()startAutoSend presence(ChatService.AUTO_ preSENCE_INTERVAL_IN_SECONDS)。
}赶上(SmackException.NotLoggedInException E){
e.printStackTrace();
}
。ChatService.getInstance()storeChatDialogs();
Looper.loop();
} @覆盖
公共无效onerror的(错误列表){
Log.w(登录聊天,ERROR+错误);
}
});
}
I am trying to invoke a method to get chat dialogs after logging in succesfully on QBChatService but when I do it, it triggers onError method, the method that gets dialogs works fine if I invoke it separately. Here is my code:
public class ChatService {
public static final int AUTO_PRESENCE_INTERVAL_IN_SECONDS = 30;
private static ChatService instance;
private QBChatService qbChatService;
private ArrayList<QBUser> opponentsUsers = new ArrayList<QBUser>();
private Map<List<Integer>, QBDialog> chatDialogsHashMap = new HashMap<List<Integer>, QBDialog>();
private ArrayList<QBDialog> chatDialogsArrayList = new ArrayList<QBDialog>();
private ConnectionListener chatConnectionListener = new ConnectionListener() {
@Override
public void connected(XMPPConnection connection) {
Log.w("CHAT SERVICE", "connected");
}
@Override
public void authenticated(XMPPConnection connection) {
Log.w("CHAT SERVICE", "authenticated");
}
@Override
public void connectionClosed() {
Log.w("CHAT SERVICE", "connectionClosed");
}
@Override
public void connectionClosedOnError(final Exception e) {
Log.w("CHAT SERVICE", "connectionClosedOnError: " + e.getLocalizedMessage());
}
@Override
public void reconnectingIn(final int seconds) {
if(seconds % 5 == 0) {
Log.w("CHAT SERVICE", "reconnectingIn: " + seconds);
}
}
@Override
public void reconnectionSuccessful() {
Log.w("CHAT SERVICE", "reconnectionSuccessful");
}
@Override
public void reconnectionFailed(final Exception error) {
Log.w("CHAT SERVICE", "reconnectionFailed: " + error.getLocalizedMessage());
}
};
public ChatService(){
this.qbChatService = QBChatService.getInstance();
this.qbChatService.addConnectionListener(this.chatConnectionListener);
}
public static synchronized ChatService getInstance(){
if(instance == null){
instance = new ChatService();
}
return instance;
}
public static boolean initializedIfNeeded(Context context){
if(!QBChatService.isInitialized()){
QBChatService.init(context);
QBChatService.setDebugEnabled(true);
Log.w("INITIALIZED QBCHAT", "SUCCESS");
return true;
}
return false;
}
public void loginToChat(){
QBAuth.getSession(new QBEntityCallbackImpl<QBSession>() {
@Override
public void onSuccess(QBSession qbSession, Bundle bundle) {
Log.w("GET SESSION", "SUCCESS");
QBUser currentSessionUser = new QBUser();
currentSessionUser.setId(qbSession.getUserId());
currentSessionUser.setLogin(MenuActivity.sharedPreferences.getString("USERNAME", ""));
currentSessionUser.setPassword(MenuActivity.sharedPreferences.getString("PASSWORD", ""));
ChatService.this.qbChatService.login(currentSessionUser, new QBEntityCallbackImpl() {
@Override
public void onSuccess() {
Log.w("LOGIN TO CHAT", "SUCCESS");
ChatService.this.storeChatDialogs();
try {
ChatService.this.qbChatService.startAutoSendPresence(AUTO_PRESENCE_INTERVAL_IN_SECONDS);
} catch (SmackException.NotLoggedInException e) {
e.printStackTrace();
}
}
@Override
public void onError(List list) {
Log.w("LOGIN TO CHAT", "ERROR");
}
});
}
@Override
public void onError(List<String> list) {
Log.w("GET SESSION", "ERROR");
}
});
}
public void createPrivateDialog(final Activity activity, QBDialog dialogToCreate){
this.qbChatService.getGroupChatManager().createDialog(dialogToCreate, new QBEntityCallbackImpl<QBDialog>() {
@Override
public void onSuccess(QBDialog qbDialog, Bundle bundle) {
Log.w("CREATE DIALOG", "SUCCESS");
((MenuActivity) activity).changeDialog(qbDialog);
}
@Override
public void onError(List<String> list) {
Log.w("CREATE DIALOG", "EXITO");
}
});
}
public void storeChatDialogs(){
QBChatService.getChatDialogs(QBDialogType.PRIVATE, new QBRequestGetBuilder(), new QBEntityCallbackImpl<ArrayList<QBDialog>>() {
@Override
public void onSuccess(ArrayList<QBDialog> qbDialogs, Bundle bundle) {
Log.w("STORE CHAT DIALOGS", "SUCCESS");
ArrayList<QBDialog> dialogsFromCurrentUser = new ArrayList<QBDialog>();
for (QBDialog dialog : qbDialogs) {
ArrayList<Integer> occupantsIDs = dialog.getOccupants();
for (Integer ID : occupantsIDs) {
if (ChatService.getInstance().getCurrentChatUser().getId() == ID.intValue()) {
dialogsFromCurrentUser.add(dialog);
}
}
}
ChatService.this.storeOpponentsUsersOfPrivateDialogs(dialogsFromCurrentUser);
ChatService.this.setChatDialogsHashMap(dialogsFromCurrentUser);
ChatService.this.setChatDialogsArrayList(dialogsFromCurrentUser);
}
@Override
public void onError(List<String> list) {
Log.w("STORE CHAT DIALOGS", "ERROR");
}
});
}
public QBUser getCurrentChatUser(){
return this.qbChatService.getUser();
}
public Integer getOpponentIDForPrivateDialog(QBDialog dialog){
Integer opponentID = 0;
for(Integer userID : dialog.getOccupants()){
if(!userID.equals(getCurrentChatUser().getId())){
opponentID = userID;
}
}
return opponentID;
}
public void storeOpponentsUsersOfPrivateDialogs(ArrayList<QBDialog> privateDialogs){
this.opponentsUsers.clear();
QBUsers.getUsersByIDs(this.getOpponentsIDsOfPrivateDialogs(privateDialogs), new QBPagedRequestBuilder(), new QBEntityCallbackImpl<ArrayList<QBUser>>() {
@Override
public void onSuccess(ArrayList<QBUser> qbUsers, Bundle bundle) {
Log.w("GET USERS BY IDS", "SUCCESS");
ChatService.this.opponentsUsers = qbUsers;
}
@Override
public void onError(List<String> list) {
Log.w("GET USERS BY IDS", "ERROR");
}
});
}
public ArrayList<Integer> getOpponentsIDsOfPrivateDialogs(ArrayList<QBDialog> privateDialogs){
ArrayList<Integer> opponentsIDs = new ArrayList<Integer>();
for(QBDialog dialog : privateDialogs){
ArrayList<Integer> occupantsIDs = dialog.getOccupants();
for(Integer ID : occupantsIDs){
if(this.getCurrentChatUser().getId() != ID.intValue()){
opponentsIDs.add(ID);
}
}
}
return opponentsIDs;
}
public QBDialog getDialog(List<Integer> occupantsIDs){
return this.chatDialogsHashMap.get(occupantsIDs);
}
public ArrayList<QBDialog> getChatDialogsArrayList(){
return this.chatDialogsArrayList;
}
public void setChatDialogsArrayList(List<QBDialog> dialogs){
this.chatDialogsArrayList.clear();
for(QBDialog dialog : dialogs){
this.chatDialogsArrayList.add(dialog);
}
}
public Map<List<Integer>, QBDialog> getChatDialogsHashMap(){
return this.chatDialogsHashMap;
}
public void setChatDialogsHashMap(List<QBDialog> dialogs){
this.chatDialogsHashMap.clear();
for(QBDialog dialog : dialogs){
this.chatDialogsHashMap.put(dialog.getOccupants(), dialog);
}
}
public void setAndRefreshAdapter(Context context, ListView dialogsList){
ArrayList<String> opponentsNames = new ArrayList<String>();
for(QBUser opponentUser : this.opponentsUsers){
opponentsNames.add(opponentUser.getLogin());
Log.w("SET ADAPTER", opponentUser.getLogin());
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, R.layout.option_player, R.id.textView_PlayersFragment_textOption, opponentsNames);
dialogsList.setAdapter(adapter);
}
}
It doesn't show any error, but I put logcat here:
07-28 17:06:59.217 28003-28003/com.example.jozumaster.myapplication W/INITIALIZED QBCHAT﹕ SUCCESS
07-28 17:06:59.630 28003-28051/com.example.jozumaster.myapplication E/NativeCrypto﹕ ssl=0x6186c9d8 cert_verify_callback x509_store_ctx=0x625de940 arg=0x0
07-28 17:06:59.630 28003-28051/com.example.jozumaster.myapplication E/NativeCrypto﹕ ssl=0x6186c9d8 cert_verify_callback calling verifyCertificateChain authMethod=DHE_RSA
07-28 17:07:00.027 28003-28003/com.example.jozumaster.myapplication W/CREATE SESSION﹕ SUCCESS
07-28 17:07:08.832 28003-28522/com.example.jozumaster.myapplication E/NativeCrypto﹕ ssl=0x61d0bdb0 cert_verify_callback x509_store_ctx=0x64cf6940 arg=0x0
07-28 17:07:08.832 28003-28522/com.example.jozumaster.myapplication E/NativeCrypto﹕ ssl=0x61d0bdb0 cert_verify_callback calling verifyCertificateChain authMethod=DHE_RSA
07-28 17:07:08.970 28003-28003/com.example.jozumaster.myapplication W/dalvikvm﹕ VFY: unable to resolve virtual method 457: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
07-28 17:07:08.971 28003-28003/com.example.jozumaster.myapplication W/dalvikvm﹕ VFY: unable to resolve virtual method 479: Landroid/content/res/TypedArray;.getType (I)I
07-28 17:07:09.415 28003-28529/com.example.jozumaster.myapplication E/NativeCrypto﹕ ssl=0x615d1a88 cert_verify_callback x509_store_ctx=0x64ef2940 arg=0x0
07-28 17:07:09.415 28003-28529/com.example.jozumaster.myapplication E/NativeCrypto﹕ ssl=0x615d1a88 cert_verify_callback calling verifyCertificateChain authMethod=DHE_RSA
07-28 17:07:09.506 28003-28003/com.example.jozumaster.myapplication W/SIGN IN﹕ SUCCESS
07-28 17:07:09.852 28003-28003/com.example.jozumaster.myapplication W/GET SESSION﹕ SUCCESS
07-28 17:07:10.314 28003-28538/com.example.jozumaster.myapplication W/CHAT SERVICE﹕ connected
07-28 17:07:11.008 28003-28538/com.example.jozumaster.myapplication W/CHAT SERVICE﹕ authenticated
07-28 17:07:11.011 28003-28538/com.example.jozumaster.myapplication W/LOGIN TO CHAT﹕ SUCCESS
07-28 17:07:11.017 28003-28538/com.example.jozumaster.myapplication W/LOGIN TO CHAT﹕ ERROR
I found the solution, so I post here to help other people who have same problem as me.
Callbacks from Quickblox works on secondary thread so if you want invoke a method that create another secondary thread, you need to do it from UI thread so you need to create a Handler object to connect with UI thread, Quickblox callback make this automatic. The problem was that secondary threads doesn't have a message queue (Handlers queue) by default (UI thread does), you have to create it using Looper class. Looper | Android Deve
Here is the code working:
public void loginToChat(final QBUser currentSessionUser){
QBChatService.getInstance().login(currentSessionUser, new QBEntityCallbackImpl() {
@Override
public void onSuccess() {
Looper.prepare();
Log.w("LOGIN TO CHAT", "SUCCESS");
try {
QBChatService.getInstance().startAutoSendPresence(ChatService.AUTO_PRESENCE_INTERVAL_IN_SECONDS);
} catch (SmackException.NotLoggedInException e) {
e.printStackTrace();
}
ChatService.getInstance().storeChatDialogs();
Looper.loop();
}
@Override
public void onError(List errors) {
Log.w("LOGIN TO CHAT", "ERROR" + errors);
}
});
}
这篇关于获取聊天对话框登录聊天Quickblox后的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!