2016-03-04 61 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更新。 –

相關問題