IObserver缺少方法

时间:2019-01-02 15:19:46

标签: c# android xamarin.android observer-pattern

Observable类已经可以使用,但是我仍然在与IObserver挣扎。

在Xamarin文档中的“ IObserver”中,它说我只需为Update()实现interface IObserver方法。

我的问题:

  1. 当我添加: IObserver时,我收到一个错误,指出我没有实现这两种方法:

            public IntPtr Handle => throw new NotImplementedException();
    
        public void Dispose()
        {
            throw new NotImplementedException();
        }
    

    为什么我需要这些方法,它们的用途是什么? Xamarin文档中未提及它们。

  2. 添加这些方法时,出现以下错误消息: 错误XA4212:类型firstTry3.bluetoothConnectionActivity/deviceFoundObserver实现了Android.Runtime.IJavaObject,但没有继承Java.Lang.ObjectJava.Lang.Throwable。不支持。

  3. 当我将override添加到update方法时,编译器说没有合适的方法可以覆盖

这是我的代码:

        public class deviceFoundObserver : IObserver
    {
        bluetoothConnectionActivity mActivity;

        public deviceFoundObserver(bluetoothConnectionActivity a)
        {
            mActivity = a;
        }

        //function is called from subject observable whenever a change happened
        public override void Update(Observable observable, Java.Lang.Object data)       //perhaps arguments like this: Observable observable, Object data
        {
            //there could be other messages as well, so first check wheather it is the right call from observer
            if ((string)data == deviceName)
            {
                mActivity.buttonStartEKG.Visibility = ViewStates.Visible;
                Log.Info(constants.tag, MethodBase.GetCurrentMethod().Name + ": Observable called update function in Observer");
            }
        }
    }

我认为使用观察者的方式出了点问题。有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

  

为什么我需要这些方法,它们的用途是什么?他们不是   在Xamarin文档中提到。

让我们看看IObserver的定义:

namespace Java.Util
{
    public interface IObserver : IJavaObject, IDisposable
    {
        void Update(Observable o, Lang.Object arg);
    }
}

这里没有提到这两种方法,但是我们可以发现IObserver继承自IJavaObjectIDisposable。然后转到IJavaObjectIDisposable的定义:

namespace Android.Runtime
{
    public interface IJavaObject : IDisposable
    {
        IntPtr Handle { get; }
    }
}

namespace System
{
    public interface IDisposable
    {
        void Dispose();
    }
}

我们可以在这里找到两种方法。 实现接口的类或结构必须实现接口定义中指定的接口成员。您还应该实现IJavaObjectIDisposable中定义的方法

  

添加这些方法时,出现以下错误消息:error   XA4212:.....

添加这些方法后,我没有收到此错误。再试一次,您可以参考以下类似问题:error-xa4212implementing-java-interfaces

  

当我向更新方法添加替代项时,编译器会说   是不适合覆盖的方法

不应将替代项添加到更新方法。只需实现接口中定义的方法即可,而不要覆盖。您可以在这里查看interface definition