在我的应用程序中,我使用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;
}
答案 0 :(得分: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方法,所以在这里你可以刷新你的联系人列表
如何通过附加和直接方法调用( setRosterNConnection())描述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;
}
};
...
RosterService 代码:
// 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
...
}
答案 1 :(得分:0)
也许你可以在AsyncTask中完成它。
AsyncTask只会在另一个线程上完成工作,只要用户关闭你的活动就会停止asyncTask。