【问题标题】:Worker Class outside ui threadui线程外的工人阶级
【发布时间】:2017-02-23 20:41:39
【问题描述】:

我必须在应用程序的开头进行大量的 sql 操作(插入太多)。我有一个像这样的启动画面。

public class SplashScreen extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
    }

    @Override
    protected void onResume() {
        super.onResume();
        ...
        new SetupDataBaseWorker(this).execute();
    }
    private class SetupDataBaseWorker extends AsyncTask<Void, Void, Void> {
        private SqliteManager db_sql;
        private Activity activity;

        public SetupDataBaseWorker(Activity activity) {
            this.activity = activity;

            db_sql = new SqliteManager(this.activity);
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            ...
            showDialogLoading();
            ...
        }

        @Override
        protected Void doInBackground(Void... urls) {
            ...
            db_sql.inserting();
            ...
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            this.activity.startActivity(new Intent(SplashScreen.this, MainActivity.class));
            this.activity.finish();
        }
    }
}

1- 总是在第一次运行时(安装后),我有 10 秒钟的空白屏幕(我想这是正在运行的脚本......),之后,我的应用程序进入 mainActivity。

2- 如果我再次运行该应用程序,它会显示 1 秒钟的空白屏幕并转到 MainActivity(甚至不显示 SplashScreen 布局)。 似乎工人阶级根本不在ui线程之外工作......我必须做什么才能做到这一点?我已经试过把这个工人放在服务中,但还是一样。

【问题讨论】:

  • 在 onResume() 中你使用的是SetupDataBaseWorker().execute(); 而不是这个new SetupDataBaseWorker(this).execute(); 并且这不是db_sql = new SqliteManager(this.activity); 或者我错了吗?
  • showDialogLoading 该方法是否有效并且实际上显示了一个加载对话框?
  • 各位,这是一个抽象...整个代码正在运行

标签: android multithreading service android-asynctask worker


【解决方案1】:

如果您在后台线程中执行所有操作,那么主线程根本不会被阻塞。

我也在 Splash 活动中做同样的事情“将数据库从资产文件夹复制到数据库”我没有得到像你这样的东西。

这是 IDE “问题”,Android Studio 比 Eclipse 需要更多时间来将应用程序安装到设备中。

您只需尝试一次“将 APK 复制到设备并从设备本身安装”。

我也假设和你一样。但问题在于与我们的代码或 Android 无关的“IDE”。

【讨论】:

  • 完美...你是对的。我做到了,瞧,完成了:)。
【解决方案2】:

我认为问题出在这里:

public SetupDataBaseWorker(Activity activity) {
    this.activity = activity;
    db_sql = new SqliteManager(this.activity);
}

将初始化器移入

public SetupDataBaseWorker(Activity activity) {
    this.activity = activity;    
}

@Override
protected Void doInBackground(Void...urls) {
    ...
    db_sql = new SqliteManager(this.activity);
    db_sql.inserting();
    ...
    return null;
}

【讨论】:

  • @MachoProgrammer,漂亮的化身猫;)
猜你喜欢
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 2018-01-18
  • 2018-10-31
  • 1970-01-01
  • 2015-04-26
  • 2013-05-05
相关资源
最近更新 更多