在c#中获取System.InvalidCastException

时间:2016-05-12 08:06:31

标签: c# android xamarin broadcastreceiver

我正在尝试从BroadcastReceiver访问全局活动变量(我不能将其作为静态变量)。为此,我以这种方式创建活动的实例:

class wifiReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        MainActivity activity = (MainActivity)context.ApplicationContext;
        ...

但是我得到 System.InvalidCastException:指定的强制转换在实例创建行中无效。。我做错了什么?

编辑:我活动的一些代码

public class MainActivity : Activity
{
    private WifiManager _manager;
    private List<string> _wifiSignals;
    private wifiReceiver _wifiReceiver;
    private TextView _Text;

    protected override void OnCreate(Bundle bundle)
    {
        ...
        _wifiReceiver = new wifiReceiver();
        _manager = (WifiManager)GetSystemService(Context.WifiService);
        _wifiSignals = new List<string>();

        if (_manager.IsWifiEnabled)
        {
            _manager.StartScan();
        }
        ...
    }

来自BroadcastReceiver的更广泛的代码:

public override void OnReceive(Context context, Intent intent)
        {
            MainActivity activity = (MainActivity)context.ApplicationContext;
            activity._wifiSignals.Clear();
            activity._wifiSignals.Add("Lista de wifi:\n");
            IList<ScanResult> wifiScanList = activity._manager.ScanResults;
            foreach (ScanResult wifiNetwork in wifiScanList)
            {
                activity._wifiSignals.Add(wifiNetwork.Ssid + ": " + wifiNetwork.Level);
            }

            //activity.presentation(activity._wifiSignals, activity);
            activity._manager.StartScan();
        }

1 个答案:

答案 0 :(得分:0)

虽然我记得在之前开发的应用程序中调用了其他活动的MainActivity属性,但我很确定你不能调用像你尝试使用StartScan()那样的函数。 我通常使用的选项是存储序列化的数据,并在Main中调用它。 我用一些方法上课:

 class persistence
 {
    ISharedPreferences prefs;
    ISharedPreferencesEditor editor;

    public persistence(Context cont)
    {
        prefs = PreferenceManager.GetDefaultSharedPreferences(cont);
        editor = prefs.Edit();
    }
    public void store(List<articulo> articulos)
    {
        string raw = JsonConvert.SerializeObject(articulos);
        editor.PutString("articulos", raw);
        editor.Commit();
    }

    public List<articulo> recover()
    {
        string raw = prefs.GetString("articulos", null);
        List<articulo> lista;
        if (raw == null)
            lista = new List<articulo>();
        else
            lista = JsonConvert.DeserializeObject<List<articulo>>(raw);
        return lista;
    }
 }

在OnReceive函数中,我调用store函数 在您的OnCreate功能中,您可以直接进行

persistence datos;
protected override void OnCreate(Bundle bundle)
{
    _wifiReceiver = new wifiReceiver();
    _manager = (WifiManager)GetSystemService(Context.WifiService);
    datos = new persistence (this);
    _wifiSignals = datos.recover();
    if(_wifiSignals.Count>0)
         StartScan();  
}

如果您不希望在调用BroadcastReceiver后清除持久性数据,这也会将数据从一种用法保留到另一种用途;