Android 在活动继续之前完成线程操作

Android 在活动继续之前完成线程操作,android,Android,这是我项目中的一段代码,我需要这个线程一直结束,然后转到最后一个Log.i()并完成函数 public void delay3Seconds(final String txt1, final String txt2, final String s, final Intent i) { //keepMoving= false; counter= 3; secondsBool= true; if(!errorMonitor)

这是我项目中的一段代码,我需要这个线程一直结束,然后转到最后一个Log.i()并完成函数

public void delay3Seconds(final String txt1, final String txt2, final String s, final Intent i)
    {
        //keepMoving= false;
        counter= 3;
        secondsBool= true;

        if(!errorMonitor)
        {  
            Log.i("Main.delay3Seconds()", s+" in 3 seconds");
            new Thread()
            {
                public void run()
                {
                    while(secondsBool)
                    {
                        try {
                            Thread.sleep(1500);
                        }
                        catch (InterruptedException e){e.printStackTrace();}
                        if(!errorMonitor)
                        {
                            handler.post(new Runnable()
                            {
                                public void run()
                                {
                                    final DialogFragment loadDF= new RecDialog(MainActivity.this, txt1, txt2, s+(counter--)+" שניות", null, false, true, ll.getWidth(), ll.getHeight());
                                    loadDF.show(getSupportFragmentManager(), "RecDialog");
                                    dialog.dismiss();
                                    dialog= loadDF;
                                    if(counter == 0)
                                        secondsBool= false;
                                }
                            });
                        }
                        else
                            secondsBool= false;
                    }
                    if(!errorMonitor)
                    {
                        handler.post(new Runnable()
                        {
                            public void run()
                            {
                                dialog.dismiss();
                                if (i.resolveActivity(getPackageManager()) != null) 
                                {
                                    Log.i("Main.delay3Seconds()", "resolveActivity != null");
                                    setResolveNotFail(true);
                                    Log.i("Main.delay3Seconds()", "resolveNotFail = "+resolveNotFail);
                                    startActivity(i);
                                }
                                else
                                {
                                    Log.i("Main.delay3Seconds()", "resolveActivity == null");
                                    setResolveNotFail(false);
                                    Log.i("Main.delay3Seconds()", "resolveNotFail = "+resolveNotFail);
                                }
                            }
                        });
                    }
                }
            }.start();
        }

        Log.i("Main.delay3Seconds()", "(end) resolveNotFail = "+resolveNotFail);
    }
我不知道该怎么做。我尝试使用synchronized(),但我可能用错了,因为函数首先完成自身,然后线程才能与活动同时工作


如果您能给我一些建议,我将不胜感激。

这绝对不是您使用线程的方式或原因。首先,如果这是UI线程,你不应该暂停它3秒钟。第二,线程的整个点是并行工作的。您永远不希望一个线程暂停并等待另一个线程。如果您需要线程A上的某些内容仅在线程B完成时发生,那么在线程B完成时,您可以通过处理程序、信号量或其他方法向线程A发送消息

看看你的代码,你似乎应该扔掉它,用定时器重新实现它。

只要在启动线程后调用.join()方法,调用线程就会等待新线程执行。 大概是这样的:

Thread t = new Thread(...);
t.start();
t.join();

这是不可能的,您正在启动一个新线程。原始线程将继续运行并退出函数。你到底想达到什么目的?是的,我实际上想做一个计时器。例如,在我的应用程序中,当用户选择播放一首歌曲时,对话框会显示一条消息“歌曲将在3,2,1秒内播放”,然后它会启动设备上的播放器,但如果应用程序找不到音乐播放器,则会显示“ResolveNotFail”将变成假的,然后活动将启动youtube;不使用线程,那么我如何制作没有线程的计时器呢?直到现在,我通过线程制作了计时器。有两种方法。在短时间内(一两秒钟),您可以简单地对处理程序执行postDelayed。在需要唤醒的很长一段时间内,通过AlarmManager发出警报。如果需要重复执行,还可以使用定时器和定时器任务。为了您的使用,我只会使用一个延迟的帖子给处理程序。这样做的好处是你仍然在主线程上,这很好,因为你所做的只是简单的UI更新。