ui线程外的工人阶级

Posted

技术标签:

【中文标题】ui线程外的工人阶级【英文标题】:Worker Class outside ui thread 【发布时间】: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 该方法是否有效并且实际上显示了一个加载对话框? 各位,这是一个抽象...整个代码正在运行 【参考方案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,漂亮的化身猫;)

以上是关于ui线程外的工人阶级的主要内容,如果未能解决你的问题,请参考以下文章

mfc c++ 将带有 postmessage 的自定义用户消息从工作线程发送到主 ui 线程

是不是UI线程的线程可以操作UI元素?

为啥loop之后就可以子线程更新ui

线程操纵UI问题

UWP 在非UI线程中更新UI

如何在android一条单独线程,更新ui ?