我的应用程序App构造函数和onStart方法之间有什么区别?

时间:2017-07-18 06:46:33

标签: xamarin xamarin.forms

这是我的课程:

public partial class App : Application
{

    public static DataManager db;

    public App()
    {
        InitializeComponent();
        MainPage = new Japanese.MainPage();  // 1
    }

    public static DataManager DB
    {
        get
        {
            if (db == null)
            {
                db = new DataManager();
            }
            return db;
        }
    }

    protected override void OnStart()
    {
        App.DB.InitData(); // 2
    }

首次运行时出现问题,因为InitData设置了表,但需要表的Japanese.MainPage()在设置表之前运行。

似乎尚未创建所需的表。

将InitData移动到App构造函数中是否合理?

2 个答案:

答案 0 :(得分:2)

每个平台调用GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject user, GraphResponse response) { if (user != null) { Log.d("FacebookSDK", user.optString("email")); } } }); Bundle parameters = new Bundle(); parameters.putString("fields", "id,name,email"); request.setParameters(parameters); request.executeAsync(); 来创建Xamarin.Forms应用程序的实例。你可以在例如iOS上的LoadApplication类:

AppDelegate

正如您所看到的那样,Xamarin Forms本身已初始化,并创建了一个新的应用程序实例。 public override bool FinishedLaunching(UIApplication app, NSDictionary options) { global::Xamarin.Forms.Forms.Init(); // Init additional components LoadApplication(new App()); return base.FinishedLaunching(app, options); } 类在每个特定于平台的项目中实例化,并传递给App方法,该方法是在加载LoadApplication并向用户显示时。

由于您使用的MainPage在其构造函数中使用来自数据库的数据,因此MainPage中的初始化在生命周期中为时已晚,因为它在创建OnStart之后发生。将数据库初始化移动到MainPage构造函数(App赋值之前)将在您的方案中起作用。确保在平台特定代码中MainPage调用之前初始化您需要初始化的任何其他组件。

答案 1 :(得分:1)

使用OnStart的主要原因是应用程序唤醒或再次放入前台时的情景。而不仅仅是第一次运行。因此,每次唤醒手机时都不想初始化数据库。

正如Steven所说,OnStart在后​​期阶段与构造函数相比被调用。既然你在MainPage构造函数中做了一些需要DB的逻辑,那么你的app会给出一个null异常。

我想给你两个提示:

  1. 使用依赖注入
  2. 如果可能,请尽量避免在任何构造函数中执行逻辑和业务操作。