【问题标题】:Thread runs after statements below are executed执行以下语句后线程运行
【发布时间】:2016-10-03 11:32:36
【问题描述】:

当 Realm dataBaseasset 文件加载时,我正在显示倒计时

 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();

            }

问题:

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

然而,活动在下面的代码加载资产文件的几秒钟后(在线程中)开始,
有没有更好的方法在设置领域配置时显示倒计时。
任何帮助将不胜感激
谢谢

【问题讨论】:

  • 那么你的问题是什么?我没完全明白!
  • 您尝试在android.intent.category.LAUNCHERActivity 中调用此代码?
  • 是的 @DouglasJunior 它在 mainActivity 的 onCreate 方法中
  • @LalitPoptani 已编辑

标签: android database realm


【解决方案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
          }
     }
}

【讨论】:

  • 对不起,先生,我的整个应用程序依赖于需要首先加载的数据库,因此代码只需要同步运行
  • 是的,我的示例必须在启动器活动中调用,在其他所有操作之前。
【解决方案2】:
  1. 如果您在应用程序的主线程(“UI-thread”,线程执行您的 Activity 生命周期方法)中运行一些耗时的任务,您的应用程序 UI 将被“冻结”,这通常是不可取的。所有后台任务(文件\网络 io、繁重的计算)都应在单独的线程中执行。
    如果启动后台操作只是为了在 UI 中显示某些内容,请考虑使用Loaders
  2. 如果您需要从多个 Activites\Fragments 访问您的对象,请考虑扩展 Application 类并将指向您的对象的链接放在那里。如果您需要在每次应用程序启动时“初始化”您的对象(在您的情况下加载 db),这可以在您的 Application 类的 onCreate() 方法中完成。如果有些对象(Activity)需要知道,在初始化完成后,可以使用Observer模式。
    示例代码:
    您的应用程序类:

    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(); 
                } 
            } 
        } 
    }
    

你的活动类:

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();
 }

【讨论】:

  • 整个应用程序依赖于需要首先加载的数据库,因此代码只需要同步运行。所以我开始一个新的活动来展示一些东西,第一个活动将加载繁重的任务
【解决方案3】:

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

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

【讨论】:

  • 我同意,但我的问题在以下语句之前运行一个线程,即加载默认配置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 2015-07-03
  • 2016-03-11
  • 1970-01-01
相关资源
最近更新 更多