【问题标题】:Passing a multidimesional array to another activity将多维数组传递给另一个活动
【发布时间】:2015-10-11 13:17:15
【问题描述】:

我需要将一个多维数组传递给另一个活动。这就是我希望能够做到的方式:

int[,,] aMultidimensionalArray = new int[a,b,c];
Intent intent = new Intent(this.Activity, typeof(outputActivity));
intent.PutExtra("array", aMultidimensionalArray);

StartActivity(intent);

但是编译器说aMultidimesionalArray 是不可序列化的。这导致我不得不使用int[][][] 来声明数组,这会导致我的其余代码出现大量其他问题。

【问题讨论】:

    标签: java c# android xamarin xamarin.android


    【解决方案1】:

    使用此Json.NET component 序列化数组
    这是一个序列化和反序列化数组的简单示例

    using Newtonsoft.Json;
    ...
    
    public class Person
    {
        public string Name { get; set; }
        public DateTime Birthday { get; set; }
    }
    
    void PersonToJsonToPersonExample ()
    {
        var person = new Person { Name = "Bob", Birthday = new DateTime (1987, 2, 2) };
        var json = JsonConvert.SerializeObject (person);
        Console.WriteLine ("JSON representation of person: {0}", json);
        var person2 = JsonConvert.DeserializeObject<Person> (json);
        Console.WriteLine ("{0} - {1}", person2.Name, person2.Birthday);
    }
    

    您还可以使用 Application 类来全局存储对象并检索它们:

    using Android.Runtime;
    
    namespace SomeName
    {
    [Application]
    public class App : Application
    {
        public string Name { get; set;}
    
        public App (IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
        {
        }
    
        public override void OnCreate ()
        {
            base.OnCreate ();
    
            Name = "";
        }
    }
    }
    

    您可以通过以下方式访问数据:

    App application = (App)Application.Context;
    application.Name = "something";
    

    我选择在 Application calss 上执行此操作,因为此类在 App 启动时调用,因此您不必手动启动它。 请记住,作用域为Application 的变量的生命周期通过扩展作用于应用程序。 如果 Android 认为有必要,此类将被 Garbage Collected,因此您必须修改代码以包含此案例。 您可以使用SharedPreferencesDatabase 来保存您的变量,以防它们被删除并从 App 类中检索它们以获得更快的结果。

    不过,在使用这种方法时不要过度浪费,因为在这个类上附加太多信息会导致性能下降。仅添加您知道应用程序的不同部分需要的信息,并且检索该信息的成本超过将其存储为应用程序变量的成本。

    调查您需要将哪些信息保存为应用程序范围的状态,以及哪些信息可以直接从您的数据库中检索。两者都存在成本问题,您需要确保取得正确的平衡。

    别忘了在OnStopOnDestroy 上根据需要释放资源。

    【讨论】:

    • 这是一种我认为可行的更简单的方法,并迫使我学习 json,所以谢谢!
    • 所以我使用的是 xamarin 的入门版本,这意味着我有大小限制,而 json.net 组件让我超出了限制。有没有办法绕过它?我正在查看一个共享的 dll,但我找不到。
    • 是的,我已经用一种在应用程序上存储全局数据的方式更新了答案,这样您就不必将数据传递给活动,您只需在启动下一个之前设置值活动并检索 OnResume 上的值或其他内容。
    • 好的,谢谢。虽然我正在测试使用System.Runtime.Serialisation.Json 来序列化数组,但您的想法可能会减少处理开销
    • 我一直在我的应用程序中找到一个更好的解决方案,以使应用程序具有所有数据都可以全局定义和访问的逻辑,我从不真正喜欢意图。您可以编写用于发送、检索等的代码,如果您可以全局定义它们,为什么要这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多