在长时间运行的线程完成之前显示Android布局?

时间:2014-05-13 10:29:14

标签: java android performance android-layout android-intent

我需要在启动主要活动时执行一项长任务,我必须将其放在onCreate()方法而不是onResume()中,因为我只想让它运行一次而不是每次活动获得焦点的时间(即关闭对话框)。

问题是,在长时间运行的任务完成后,布局才会显示,只是让应用显示黑屏。

我认为可能在另一个Thread中将其踢掉如下就足够了但是看起来主线程在继续布局之前仍然等待这个完成?

final Thread launcherThread = new Thread(new Runnable() {
     @Override
     public void run() {
          doLongTask();
     }
});
launcherThread.start();

提前感谢任何帮助。

如果它有助于整个onCreate()如下:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        inc_menu = (MenuContainer) this.getLayoutInflater().inflate(R.layout.main, null);
        setContentView(inc_menu);
        final Thread launcherThread = new Thread(new Runnable() {
             @Override
             public void run() {
                   doLongTask();
             }
        });
        launcherThread.start();
    }

3 个答案:

答案 0 :(得分:1)

应该是

launcherThread.start();

否则Runnable将在调用run方法的线程的上下文中执行。

另外

 inc_menu = (MenuContainer) this.getLayoutInflater().inflate(R.layout.main, null);
 setContentView(inc_menu);

可以在

中更改
 setContentView(R.layout.main);

在这种情况下,没有明显的理由使用inflater。

答案 1 :(得分:0)

你错了。当你在同一个线程的start中调用Thread.run()时,这就是你的界面没有绘制的原因。将其替换为Thread.start()。它将启动新线程,UI将不会被阻止。

答案 2 :(得分:0)

在为Android编程时,首选使用AsyncTask

new AsyncTask<Void,Void,Void>(){
    @Override
    protected Void doInBackground(Void ... params){
        doLongTask();
        return null;
    }
}.execute();