0

在我的应用程序中,我使用 XMPP 进行聊天,在此我必须创建一个服务以将所有联系人从 XMPP 服务器下载到我的数据库。我现在正在做下面的代码,获取所有联系人需要很长时间,我没有兴趣让用户等待完成下载所有联系人。由于这个原因,我想使用服务在后台完成这项工作,然后将它们存储在数据库中,如果数据库有新联系人,我将使用提供程序更新联系人。

我知道如何创建服务,但在这里我无法将 Roster 和 XMPP 连接等参数传递给服务,这些参数是从 XMPP 服务器下载联系人所必需的。请任何人指导我如何解决这个问题。这是我现在使用的代码。

public class GmailXmppClient { 

   public GmailXmppClient(ChatAccountsFragment _fragment, Context _context) {

      this.fragment = _fragment;
      this.context = _context;


      ConnectionConfiguration config = new ConnectionConfiguration(server_host, SERVER_PORT, SERVICE_NAME);
      m_connection = new XMPPConnection(config);
      try {
          m_connection.connect();
      } catch (XMPPException e) {
           e.printStackTrace();
      }
  }

  public Roster getRoster() {
     Log.i(TAG, " getRoster ");
     return m_connection.getRoster();
  }

  public boolean Login(String uname, String pass ) throws XMPPException {

    m_connection.login(uname, pass);     
    this.fragment.Gtalk_logInComplete(uname, m_connection);             
    this.setPacketFilters();
    Presence presence = new Presence(Presence.Type.available);
    Log.i("ID", "" + presence);
    m_connection.sendPacket(presence);      
    return true;
  } 

  public void disconnect() {
     m_connection.disconnect();
  }
}

从上面这段代码之后的代码

this.fragment.Gtalk_logInComplete(uname, m_connection); 

此代码将运行以从 xmpp 服务器获取联系人

private void getConts() {

   Roster roster = colors_xmpp_client.getRoster();
   String file_name;
   for (RosterEntry entry : roster.getEntries()) {
     if (entry.getType() == ItemType.to || entry.getType() == ItemType.both) {              

        boolean yes = Contact_data_source.checkUsername(entry.getUser());
        Log.i(TAG, "Con=" + yes);
        if (!yes) {
           String na = entry.getUser();
           String[] me = na.split("@");                     
           Bitmap buddy_img = buddyImage(entry, _connection);
           if (buddy_img != null)
               file_name = Store(buddy_img);
           else
               file_name = "";
           if (entry.getName() == null)
               Contact_data_source.createContact( entry.getUser(), entry.getUser(), Uname, file_name, UsedStrings.SipAccount, me[0] );
           else
               Contact_data_source.createContact( entry.getName(), entry.getUser(), Uname, file_name, UsedStrings.SipAccount, me[0] );
         } else {
          Log.i(TAG, "Con=exist");
         }
      }
    }               
 return null;
}
4

2 回答 2

1

您可以使用以下流程:
1) 启动 Activity,绑定 RosterService

2) 使用所需的上下文(应用程序上下文或活动)注册 ContentObserver context.getContentResolver().registerContentObserver(uriRosterChanged, true, contentObserver);


3) 将此上下文和 contentObserver 发送到 RosterService

4) 服务中:获取联系人并将其存储到 db 和 !!! >>

5) 在服务中: context.getContentResolver().notifyChange(uriRosterChanged, contentObserver)

6) 为下一个联系人重复 i.4

i.5 -> 将触发 contentObserver.onChange 方法,因此您可以在此处刷新您的联系人列表


2 如何将参数发送到服务2 种方式描述了额外和直接方法调用(setRosterNConnection()):

活动代码:

...
RosterService mService;
@Override public void onCreate(Bundle savedInstanceState) {
    ...
    Intent intent = new Intent(this, RosterService.class);
    intent.putExtra("Key", "Value");
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    ...
}
...
Roster mRoster ;
XMPPConnection mConnection;
...
private ServiceConnection mConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className,
            IBinder service) {
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();       
        mService.setRosterNConnection(mRoster, mConnection);
        mService.doJob();
    }

    public void onServiceDisconnected(ComponentName arg0) {
                mService = null;
    }
};
...


名册服务代码:

// some class LocalBinder extends Binder{...} if some needs
private  LocalBinder mBinder = new LocalBinder(); // class LocalBinder extends Binder{...}
...
@Override
public IBinder onBind(Intent intent) {
    Bundle extras = intent.getExtras(); 
    if(extras == null)
        Log.d("RosterService","extras is empty");
    else
    {
        Log.d("RosterService","extras not empty");
        String key = (String) extras.get("Key");
        ...
    }
    return mBinder;
}
...
public void setRosterNConnection (Roster roster , XMPPConnection connection){
...
}
...
public void doJob(){
 // get and save contacts
    ...
}
于 2013-01-30T10:44:43.280 回答
0

也许你可以在 AsyncTask 中做到这一点。

AsyncTask 只会在另一个线程上完成工作,只要用户关闭您的活动,asyncTask 就会停止。

于 2013-01-30T09:44:22.083 回答