如何获得进度对话框,直到从android中的服务获得响应?

时间:2013-04-08 06:47:59

标签: android service xmpp progressdialog asmack

我正在使用服务在我的应用程序中运行长后台任务,在服务中这些函数正在运行登录到XMPP并从XMPP服务器获取一些数据。我想显示登录完成后的进度条。如何从服务到活动获得响应以正确更新进度条以避免UI中的某些异常。 我这样称呼服务

final Intent gtalk_intent = new Intent(AccountsActivity.this, GtalkService.class);             
gtalk_intent.putExtra("user_name", acc.getAcc_Name());
gtalk_intent.putExtra("user_pass", acc.getAcc_Pass());               
startService(gtalk_intent);

这是来自服务的代码

public class PmService extends Service {

   @Override
   public IBinder onBind(Intent intent) {               
      return mBinder;
   }

   public class PmBinder extends Binder {
      public PmService getService() {
         return PmService.this;
      }
   }

   @Override
   public void onCreate() {

      super.onCreate(); 
      context = this;       
      app_preferences = new AppPreferences(this);

      chat_source = new ChatsDataSource(this);  
      chat_source.open();
   } 

   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      Bundle extras = intent.getExtras();       
      if(extras == null)  {         
         full_name = extras.getString("user_name");
         if(full_name.contains("@")) {
            String[] _na = full_name.split("@");
            U_name = _na[0];
        }
        U_pass = extras.getString("user_pass");                    
    }       
    new PmAsync().execute();
    return START_STICKY;
}

private class PmAsync extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {          
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Void result) {          
        super.onPostExecute(result);
    }

    @Override
    protected Void doInBackground(Void... params) {     
        SASLAuthentication.supportSASLMechanism("PLAIN", 0);
        ConnectionConfiguration config = new ConnectionConfiguration(server_host, SERVER_PORT, SERVICE_NAME);
        configure(ProviderManager.getInstance());
        m_connection = new XMPPConnection(config);
        try {            
            m_connection.connect();                  
            Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual);              
        } catch (XMPPException e) {             
            e.printStackTrace();
        }           
        try {               
            m_connection.login(U_name, U_pass);
            setPacketFilters();                     
        } catch (XMPPException e) {                 
        }

        return null;
    }       
}

我想显示登录完成后的进度条,登录完成后如何响应服务?

2 个答案:

答案 0 :(得分:0)

通过Binder,您可以向Activity发送回调,这意味着您可以更新用户界面。

  1. 根据您的Binder添加方法(让我们将其命名为onProgress
  2. 来自此AsyncTask
  3. Binder来电方式
  4. 为了了解进度更新,请考虑使用观察者模式(换句话说 - 您的Activity应该监听Binder的更新,或者更具体地说 - 调用Binder.onProgress方法的更新

答案 1 :(得分:-1)

您可以通过覆盖onProgress()方法来更新进度条 这里是您可以参考的案例。link