在ui螺纹之外的工作者类

时间:2016-10-14 12:04:51

标签: android multithreading service android-asynctask worker

我必须在应用程序的开头做一个大量的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线程之外工作......我需要做些什么才能实现这一目标?我已经尝试过把这个工作者放在一个服务上,但仍然是一样的。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

我认为问题在于:

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