草庐IT

android - 在 Android Activity 之间高效地传递自定义对象数据 [Mono Android]

coder 2023-11-26 原文

我已经被这个难住了一段时间了。 我正在开发一个 Android 应用程序,可以存储一个人的鱼获量、最喜欢的钓鱼地点、渔具箱库存和其他数据。我所有的类都是可序列化的,并且可以在到目前为止似乎有效的 Activity 之间保存和加载。但我预测,随着存储的数据越来越多,应用程序将开始运行缓慢。

我基本上想问的是,有没有什么方法可以在整个应用程序中保留这些数据,这样我就不必在每次弹出新屏幕时都加载它。我已经找到以下信息来提供帮助,但我需要更清楚地理解这些信息:

另一个论坛说你可以把它塞进 Application 对象中:

[Application]
public class MyApp : Android.App.Application {
    public MyApp(IntPtr handle)
        : base (handle)
    {
    }

    public FishingData Data {get; set;}
}

然后在您的 Activity 中:

((MyApp) this.ApplicationContext).Data = value;

所以我以前从未真正听说过这种方法,我不确定这是否会贯穿整个应用程序过程(我觉得无论哪种方式都必须通过序列化加载数据。这就是我想要的应用待办事项:

第一个 Activity 是主菜单,屏幕加载时必须完成以下操作:

  1. 如果找到设置文件,则使用序列化加载以前的 FishingData 对象(我知道该怎么做)
  2. 如果没有,则创建一个新的干净的 FishingData 对象以备后用(我也知道这一点)
  3. 现在我们有了 FishingData 对象,我如何确保不必在每个 Activity 中重复步骤 1-2。我怎样才能以某种方式将 FishingData 对象传递给下一个 Activity ,并确保它在应用程序仍然存在时在全局范围内存在。 我只想加载它一次(通过序列化)(<>

任何帮助将不胜感激。这让我很烦恼,我似乎无法弄清楚。这似乎是一件很常见的事情,但我没有找到任何详细信息。

最佳答案

以下是我如何通过 parcelable 在应用程序周围传递数据。假设您有一个名为 Fisherman 的类(基本上是针对用户)

public class Fisherman implements Parcelable {
 private String name;
 private Tacklebox box;
 public int describeContents() {
     return 0;
 }

 public void writeToParcel(Parcel out, int flags) {
     out.writeString(name);
     out.writeParcelable(box, 0);
 }

 public static final Parcelable.Creator<Fisherman> CREATOR
         = new Parcelable.Creator<Fisherman>() {
     public Fisherman createFromParcel(Parcel in) {
         return new Fisherman(in);
     }

     public Fisherman[] newArray(int size) {
         return new Fisherman[size];
     }
 };

 private Fisherman(Parcel in) {
     name = in.readString();
     box = in.readParcelable(com.fisher.Tacklebox);
 }
}

在此示例中,您为您拥有的每个数据模型定义了 parcelable。假设您有一个渔夫对象,其中包含另一个名为 tacklebox 的对象。如果您继续嵌套模型,您还将为 tacklebox 定义它,依此类推。这样,在 Activity 之间传递数据所需要做的就是

Intent intent = new Intent(this, Activity.class);
intent.putParcelableExtra("com.fisher.Fisherman", fisherman);

阅读

Bundle b = getIntent().getExtras();
Fisherman fisher = b.getParcelable("com.fisher.Fisherman");

不幸的是,这只能回答您问题的第 3 步,但我建议将您的 3 个步骤中的每一个都分解成自己的问题,因为您尝试做的事情比一个问题稍微长一些

关于android - 在 Android Activity 之间高效地传递自定义对象数据 [Mono Android],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13633092/

有关android - 在 Android Activity 之间高效地传递自定义对象数据 [Mono Android]的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  3. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  4. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  5. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  6. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  7. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  8. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  9. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

  10. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

随机推荐