执行以下语句后运行线程

时间:2016-10-03 11:32:36

标签: android database realm

我正在显示倒计时,而资产文件中加载了Realm dataBase

 SharedPreferences wmbPreference = PreferenceManager.getDefaultSharedPreferences(this);
            boolean isFirstRun = wmbPreference.getBoolean("FIRSTRUN", true);
            if (isFirstRun)
            {
                handler = new Handler();
                Runnable r = new Runnable() {
                    public void run() {
                        Intent intent=new Intent(context,FirstRun.class);
                        startActivity(intent);
                    }
                };
                handler.post(r);


                RealmConfiguration config = new RealmConfiguration.Builder(context)
                        .name(Realm.DEFAULT_REALM_NAME)
                        .migration(new in.webic.longevity.longevity.Word())
                        .assetFile(context, "Default.realm")
                        .schemaVersion(0)
                        .build();

                realm = realm.getInstance(config);
                realm.close();

                SharedPreferences.Editor editor = wmbPreference.edit();
                editor.putBoolean("FIRSTRUN", false);
                editor.commit();

            }

问题:

  应该显示

倒计时,而不是资产文件时的空白屏幕   复制为默认数据库

然而,活动在几秒钟后(在线程中)开始,由下面的代码加载资产文件,在安装Realm配置时是否有更好的方式显示倒计时。
任何帮助将不胜感激

3 个答案:

答案 0 :(得分:1)

如果要显示倒计时,则必须手动复制文件。

然后,在AsyncTask中运行慢速代码。

像这样:

public class LauncherActivity extends Activity {

     public void onCreate(...) {
        // init view

        new SlowTask().execute();
     }


     class SlowTask extends AsyncTask<Void, Void, Void>{

          protected Void doInBackground(Void... params) {

              // realm slow code here
              return null;
          }

          protected void onPostExecute(Void result) {
             // start your next activity here
          }
     }
}

答案 1 :(得分:0)

您无法估算处理时间。所以倒计时不是一个好选择。在从资源加载数据之前显示一些进度对话框,然后在加载数据后,关闭对话框。

<强>更新 实际上你的问题是你的线程在加载数据之前执行的问题!精细?。 您需要做的是在AsyncTask类中执行所有处理任务,您应该在onPreExecute(...)方法中显示进度对话框。然后用doInBackground(...)方法处理工作。然后在onPostExecute(...)中,关闭进度对话框。

答案 2 :(得分:0)

  1. 如果您在应用程序的主线程(&#34; UI-thread&#34 ;,线程执行了您的Activity生命周期方法)中运行了一些耗时的任务,那么您的应用程序UI将被冻结&#34;这通常是不受欢迎的。所有后台任务(文件\网络io,繁重的计算)都应该在单独的线程中执行。
    如果后台操作仅在UI中显示某些内容,请考虑使用Loaders
  2. 如果您需要从多个Activites \ Fragments访问您的对象,请考虑扩展Application类并将链接放置到您的对象。如果你需要&#34;初始化&#34;在每个应用程序启动时你的对象(在你的情况下加载db),这可以在你的Application类的onCreate()方法中完成。如果某些对象(活动)需要知道,初始化完成后,您可以使用观察者模式。
    示例代码:
    您的申请类:

    public void onCreate() {   
        super.onCreate(); 
        mHandler = new Handler(); //for communicating with UI thread
        if (firstRun) { 
            new Thread(new Runnable() { 
                loadMyDb(); 
                mHandler.post(new Runnable()) { 
                    notifyListeners(); 
                } 
            } 
        } 
    }
    
  3. 您的活动课程:

    protected void onCreate() {
        super.onCreate();
        setContentView(R.layout.your_layout); 
        //setup your layout and views
        MyApplication app = (MyApplication)getApplicationContext();
        if (app.isDbLoaded()) {
            showContent();
        } else {
            showProgressBar();
            app.addDbLoadListener(this);
        }
     }
    
     public void onDbLoaded() {
         hideProgressBar();
         app.removeDbLoadListener(this);
         showContent();
     }