2013-07-23 59 views
0

每個示例都有Service onStart(),並在一段時間內從Service調用方法(如onClick之後)。直到那個onClick服務被綁定。Android的Java - 如何使活動等待,直到服務綁定?

我得到的問題,服務需要一段時間,直到它被綁定,它異步綁定。 因此,如果我啓動並且需要立即從服務獲取一些數據的活動 - 它會崩潰,因爲它尚未綁定。所以我需要等待我的活動​​等待連接完成。我怎麼做?

回答

-2

我想你想要的是:http://developer.android.com/guide/components/bound-services.html

在此頁面,您可以找到:

/** Defines callbacks for service binding, passed to bindService() */ 
private ServiceConnection mConnection = new ServiceConnection() { 

    @Override 
    public void onServiceConnected(ComponentName className, 
      IBinder service) { 
     // We've bound to LocalService, cast the IBinder and get LocalService instance 
     LocalBinder binder = (LocalBinder) service; 
     mService = binder.getService(); 
     mBound = true; 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
     mBound = false; 
    } 
}; 

onServiceConnected方法被調用時,該服務已準備就緒,你可以做你的東西里(或使用mBound屬性)。

要綁定到你的服務,使用:

// Bind to LocalService 
    Intent intent = new Intent(this, LocalService.class); 
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 
+0

是的,我知道。但是如果你試圖做一些像localService.myMethod(); - 你的活動會崩潰,因爲綁定不會立即發生,如果你問mBound是真還是假 - 肯定會是錯誤的。我需要的是某種監聽器,當mBound將成爲true時,活動可以繼續 – user2234594

+0

然後,您可以將代碼直接放在'onServiceConnected'中。那有什麼問題? – Brtle

+0

太棒了!現在這就是我正在尋找的答案!)我只是移動所有活動 – user2234594

0

您可以利用一個pendingList變量來處理這種情況:

private ICoreService mService; 
private boolean mConnected = false; 
private boolean mConnecting = false; 
private List<Something> mPendingTasks = new ArrayList<Something>; 

private void bindService() {  
     try { 
      Intent service = new Intent(); 
      service.setClassName(Constants.THE_SERVICE_PACKAGE_NAME, Constants.THE_SERVICE_FULL_NAME); 
      mContext.bindService(service, mServiceConnection, Context.BIND_AUTO_CREATE); 
      mConnecting = true; 
     } catch (Exception e) { 
       //handle exception 
     }   
} 

public void serviceDoSomething(Something task) { 
    try { 
     if (mService == null) { 
      synchronized (mPendingTasks) { 
       mPendingTasks.add(task); 
      } 
     } else { 
      mService.doSomething(task); 
     } 
    } catch (Exception e) { 
     //handle exception 
    } 
} 

private ServiceConnection mServiceConnection = new ServiceConnection() { 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     mConnected = false; 
     mConnecting = false; 
     mService = null; 
    } 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     mConnected = true; 
     mConnecting = false; 
     mService = ICoreService.Stub.asInterface(service); 
     drainPendingTasks(); 
    } 
}; 

private void drainPendingTasks() { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      synchronized (mPendingTasks) { 
       try { 
        if (!mPendingTasks.isEmpty()) { 
         for (Something task : mPendingTasks) { 
          mService.doSomething(task); 
         } 
         mPendingTasks.clear(); 
        } 
       } catch (Exception e) { 
        //handle exception 
       } 
      } 
     } 
    }).start(); 
}