亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法訪問活動中的服務中的數據

無法訪問活動中的服務中的數據

C#
呼啦一陣風 2021-05-20 09:15:12
我正在構建一個Xamarin.Android應用程序。我有一個正在運行的服務,我正在嘗試將數據從該服務獲取到我擁有的活動。我知道人們對發布過多的代碼感到不滿,但是我不確定我的問題在哪里。我要發布我認為必要的內容:服務[Service]public class DataService : Service{    public List<MyObjects> MyObjectList { get; private set; }    public IBinder Binder { get; private set; }    public override IBinder OnBind(Intent intent)    {        this.Binder = new DataServiceBinder(this);        return this.Binder;    }    public override void OnCreate()    {        base.OnCreate();        pendingIntent = PendingIntent.GetActivity(this, 0, new Intent(this, typeof(MainActivity)), 0);        StartForeground(NotificationID, GetNotification("Started Sync"));        //Do some work here to instantiate and populate the List    }}服務活頁夾public class DataServiceBinder : Binder{    public DataServiceBinder(DataService service)    {        Service = service;    }    public DataService Service { get; private set; }}服務連接public class DataServiceConnection : Object, IServiceConnection    {        public DataService Service { get; private set; }        public DataServiceBinder dataServiceBinder;        public bool IsConnected { get; private set; }        public void OnServiceConnected(ComponentName name, IBinder service)        {            dataServiceBinder = service as DataServiceBinder;            IsConnected = this.dataServiceBinder != null;            Service = dataServiceBinder.Service;            ServiceConnectionChanged?.Invoke(this, true);        }        public void OnServiceDisconnected(ComponentName name)        {            ServiceConnectionChanged?.Invoke(this, false);            Service = null;        }        public event EventHandler<bool> ServiceConnectionChanged;    }在我的活動中,當我嘗試通過服務傳遞適配器列表時,“服務”為null,因此我得到了null引用異常。為什么我的服務為空?我是否無法正確綁定我的服務?為了記錄,它們服務在“應用程序”上下文中啟動。
查看完整描述

1 回答

?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

好的,我找到了解決方案。由于連接到服務是異步的,所以我不能期望適配器能夠像這樣同步獲取數據:


var adapter = new MyDataAdapter(DataServiceConnection.Service.MyObjectList);

相反,我將自己的活動修改為如下所示:


public class MyDataActivity : AppCompatActivity

    {

        private DataServiceConnection DataServiceConnection;


        protected override void OnCreate(Bundle savedInstanceState)

        {

            base.OnCreate(savedInstanceState);


            if (DataServiceConnection == null)

            {

                this.DataServiceConnection = new DataServiceConnection();

            }


            Intent serviceToStart = new Intent(this, typeof(DataService));

            BindService(serviceToStart, this.DataServiceConnection, Bind.AutoCreate);

            DataServiceConnection.ServiceConnectionChanged += ServiceConnectionChanged;

            SetContentView(Resource.Layout.MyDataLayout);


        }

        private void ServiceConnectionChanged(object sender, bool isConnected)

        {

            if(DataServiceConnection.Service == null)

            {

                return;

            }

            if(isConnected)

            {

                var adapter = new MyDataAdapter(DataServiceConnection.Service.MyObjectList);

            }

        }

        protected override void OnResume()

        {

            var intent = new Intent(this, typeof(DataService));

            BindService(intent, DataServiceConnection, Bind.AutoCreate);

            base.OnResume();

        }


        protected override void OnPause()

        {

            UnbindService(DataServiceConnection);

            base.OnPause();

        }

我還對服務連接進行了如下修改:


public class DataServiceConnection : Object, IServiceConnection

    {

        public DataService Service { get; private set; }

        public MyDataActivity DataActivity;

        public event EventHandler<bool> ServiceConnectionChanged;


        public DataServiceConnection(MyDataActivity myDataActivity)

        {

            DataActivity = myDataActivity;

        }


        public void OnServiceConnected(ComponentName name, IBinder service)

        {

            dataServiceBinder = service as DataServiceBinder;

            Service = dataServiceBinder.Service;

            ServiceConnectionChanged?.Invoke(this, true);

        }


        public void OnServiceDisconnected(ComponentName name)

        {

            ServiceConnectionChanged?.Invoke(this, false);

            Service = null;

        }

    }

現在,我的解決方案僅在連接服務時嘗試將數據發送到適配器。該解決方案對我有用,希望對其他任何人有幫助。


查看完整回答
反對 回復 2021-05-23
  • 1 回答
  • 0 關注
  • 136 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號