2016-03-04 64 views
0

这是我项目中的一段代码,我需要这个线程结束直到最后才转到最后一个Log.i()并完成该函数。finish在活动继续之前的线程动作

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

我将不胜感激就如何做..

+0

这是不可能的,你开始一个新的线程。原始线程继续运行并退出该功能。你究竟想达到什么目的? – Francesc

回答

0

这绝对不是如何或为何你使用一个线程任何提示。首先,如果这是UI线程,你不应该暂停3秒。其次,线程的整个点是并行工作的。你永远不希望一个线程暂停并等待另一个线程。如果需要线程A上的某些内容仅在线程B完成时发生,则在线程B完成时,通过处理程序,信号量或其他方法向线程A发送消息。

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

+0

是的,我实际上正在尝试做一个计时器。在我的应用程序中,当用户选择播放歌曲时,例如,对话框显示消息“该歌曲将以3,2,1秒播放”,然后它将启动设备上的播放器,但是如果应用程序没有找到音乐播放器的意图,“ResolveNotFail”将成为错误,然后该活动将启动YouTube。 – Lena

+0

所以你说的是我应该; nt使用一个线程,那么我如何让没有线程的计时器呢?直到现在我通过线程定时器。 – Lena

+0

有几种方法。在短时间内(一秒钟或两秒钟),您可以简单地将一个帖子拖延到一个处理程序。在需要唤醒的很长时间内,通过AlarmManager发出警报。如果您需要重复执行,还有Timer和TimerTask。为了您的使用,我只是使用延迟发布到Handler。好处是你仍然在主线程,这是很好的,因为你所做的只是简单的UI更新。 –

相关问题