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

时间:2016-03-04 00:30:24

标签: 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("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(),但我可能使用它错误,因为该函数首先完成自己,然后只有线程工作,同时活动。

我很感激有关如何做到这一点的任何提示..

2 个答案:

答案 0 :(得分:0)

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

看看你的代码,看起来你应该抛弃它并用计时器重新实现它。

答案 1 :(得分:0)

https://docs.oracle.com/javase/tutorial/essential/concurrency/join.html

在启动线程后调用.join()方法,这样调用线程将等到新线程执行完毕。 像这样:

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