繁体   English   中英

在C#中获取System.InvalidCastException

[英]Getting System.InvalidCastException in c#

我正在尝试从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();
        }

尽管我记得在以前开发的应用程序中从其他活动调用过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函数中,我调用存储函数在您的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之后清除持久性数据,这还将使数据从一种用法转移到另一种用法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM