有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我需要在主活动启动时运行一个长任务,我必须将它放在onCreate()方法中,而不是onResume(),因为我只希望它运行一次,而不是每次活动获得焦点时(即通过关闭对话框)

问题在于,在长时间运行的任务完成之前,布局不会显示,只会让应用程序显示一个黑屏

我想,也许在另一个线程中启动它(如下所示)就足够了,但主线程似乎仍在等待它完成,然后再继续布局

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) 个答案

  1. # 1 楼答案

    你搞错了。当你调用线程时。在同一线程的start中运行(),这就是为什么你的界面没有绘制。把它换成螺纹。开始()。它将启动新线程,UI将不会被阻止

  2. # 2 楼答案

    应该是的

    launcherThread.start();
    

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

    还有

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

    可以在

     setContentView(R.layout.main);
    

    在这种情况下,显然没有理由使用充气机

  3. # 3 楼答案

    在为Android编程时,更喜欢使用AsyncTask

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