2017-04-06 32 views
0

之後,與Android的片段互相交談和活動有這麼多的樂趣。我很高興嘗試從後臺服務進行一些異步回調。爲了我的目的,我只想讓活動中的監聽者從後臺服務獲取回調。如何做像Android Fragments這樣的自定義異步回調?

在叫SomeService後臺服務,我創建了一個接口和實例成員聽衆:

private OnSomethingHappenedListener mListener; 
public interface OnSomethingHappenedListener { 
    void onSomethingHappened(String mWhateverHappened); 
} 

而且在事情應該發生,我有以下的代碼

if (mListener != null) 
    { 
     mListener.onSomethingHappened(AHHHappened); 
    }else 
    { 
     Log.e(TAG,"mListener for the interface method is null for some reason?"); 
    } 

然後在接受回調的活動中,我執行了合同,並且改寫了方法。

public class listenerActivity extends AppCompatActivity implements SomeService.OnSomethingHappenedListener{ 

    // Receive Callback 
     @Override 
     public void onSomethingHappened(String mWhateverHappened) { Log.i(TAG,mWhateverHappened); 
     } 
} 

我做的東西非常相似,這與片段,並沒有錯誤,但由於某些原因,在這種情況下,mListener爲空當服務運行,並且無法啓動呼叫。我缺少什麼初始化步驟?謝謝。

編輯2017/4/6 從創建一個偵聽器,然後附加它來實現它在類中,然後重寫該方法。

我真正想要做的是在活動端做一個簡單的實現,而不用創建一個服務的對象實例來調用監聽器setter方法。我想要這樣做的方式是Android如何使用片段< - >活動執行此操作。使用片段,將檢查上下文,然後使用onAttach()回調中的上下文對其進行初始化。

我在看片段的例子,其中onAttach()回調已經通過上下文,並且上下文被轉移到接口類並設置爲偵聽器,我如何獲得正確的上下文,這應該是一個界面的實例?

@Override 
public void onAttach(Context context) 
{ super.onAttach(context); 
if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; 
} 
+1

你是否將這個活動傳遞給這個類的*** mListeistener.onSomethingHappened(AHHHappened); *** ...? –

+1

你不會在任何地方設置'mListener'的值:'mListener = ...' –

+0

Thx爲頭。通過片段示例,現在我注意到在onAttach(上下文上下文)中,mListener確實分配了參數上下文,並將其轉換爲接口類。現在我的問題是,如何將正確的上下文從活動傳遞到服務? –

回答

0

,因爲你沒有初始化監聽

像這樣

public void setMylistener(OnSomethingHappenedListener onSomethingHappenedListener) 
{ 
    mListener = onSomethingHappenedListener 
} 

設置監聽器在SomeService類創建的方法,並呼籲SomeService課前調用此方法

someService.setMylistener(onSomethingHappenedListener); 

就是這樣。

+0

該方法應該是一個靜態setter方法可從其他活動訪問?就像你調用它的方式someService.setMylistener(..); –

+0

**沒有**靜態方法不起作用,您必須創建該類的對象。 –