2017-04-06 35 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

**没有**静态方法不起作用,您必须创建该类的对象。 –