【问题标题】:How to do custom async callbacks like Android Fragments do?如何像 Android Fragments 那样做自定义异步回调?
【发布时间】:2017-04-06 05:23:18
【问题描述】:

在与 Android 片段相互交谈以及与活动交谈之后获得了如此多的乐趣。我很高兴尝试从后台服务进行一些异步回调。出于我的目的,我只希望活动中的侦听器从后台服务中获取回调。

在名为 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?");
    }

然后在接收回调的activity中,我实现了契约,重写了方法。

public class listenerActivity extends AppCompatActivity implements SomeService.OnSomethingHappenedListener{

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

我用片段做了与此非常相似的事情并且没有错误,但是由于某种原因,在这种情况下,当服务运行时,mListener 为空,并且无法启动调用。我缺少哪些初始化步骤?谢谢。

2017 年 4 月 6 日编辑 从创建监听器,然后将其附加到在类中实现它,然后覆盖方法。

我真正想做的是在活动端做一个简单的实现,而不是创建服务的对象实例只是为了调用侦听器设置器方法。我想做的方式是Android如何使用片段活动。使用片段时,会检查上下文,然后在 onAttach() 回调中使用上下文进行初始化。

我正在查看片段示例,其中 onAttach() 回调已传递上下文并且该上下文被强制转换为接口类并设置为侦听器,我如何获得正确的上下文,这应该是一个实例界面的?

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

【问题讨论】:

  • 您是否将该活动传递给执行此操作的类mListener.onSomethingHappened(AHHHappened);...??
  • 您没有在任何地方设置 mListener 值:mListener = ...
  • 谢谢提醒。查看片段示例,现在我注意到在 onAttach(Context context) 中,mListener 确实分配有转换为接口类的参数 context。现在我的问题是,如何将正确的上下文从活动传递给服务?
  • 您永远不应该将上下文从 Activity 传递给服务。服务有它自己的上下文——它本身就是一个上下文。将服务绑定到活动时可以设置监听器
  • 我正在查看片段示例,其中 onAttach() 回调已传递上下文,并且该上下文被强制转换为接口类并设置为侦听器,该上下文是应用程序上下文还是服务上下文? @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; }

标签: java android android-fragments callback


【解决方案1】:

因为你没有初始化监听器

像这样在SomeService 类中创建一个设置监听器的方法

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

并在调用SomeService类之前调用​​此方法

someService.setMylistener(onSomethingHappenedListener);

就是这样。

【讨论】:

  • 该方法是否应该是可从另一个活动访问的静态 setter 方法?就像你叫它 someService.setMylistener(..);
  • 静态方法不起作用,您必须创建该类的对象。
猜你喜欢
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2016-04-03
  • 2017-10-05
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多