2016-04-29 93 views
1

我有代码的计时器,但如果我改变片段计时器被重置为00:00我希望该计时器仍然计数后,我点击停止或暂停或这意味着这个计时器仍然计数在后台 如何做到这一点? 这是我的代码,如何在后台运行计时器?

public class TimerFragment extends BaseFragment { 
    private Button startButton; 
    private Button pauseButton; 
    private TextView timerValue; 
    private long startTime = 0L; 
    private Handler customHandler = new Handler(); 
    long timeInMilliseconds = 0L; 
    long timeSwapBuff = 0L; 
    long updatedTime = 0L; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     rootView = inflater.inflate(R.layout.fragment_timer, container, false); 

     initialize(); 
     //when start 

     startTime = SystemClock.uptimeMillis(); 
     customHandler.postDelayed(updateTimerThread, 0); 

     //pause 
     pauseButton.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View view) { 

       timeSwapBuff += timeInMilliseconds; 
       customHandler.removeCallbacks(updateTimerThread); 

      } 
     }); 

     return rootView; 
    } 

    private Runnable updateTimerThread = new Runnable() { 

     public void run() { 

      timeInMilliseconds = SystemClock.uptimeMillis() - startTime; 

      updatedTime = timeSwapBuff + timeInMilliseconds; 

      int secs = (int) (updatedTime/1000); 
      int mins = secs/60; 
      secs = secs % 60; 

      timerValue.setText("" + mins + ":" 
        + String.format("%02d", secs)); 
      customHandler.postDelayed(this, 0); 
     } 

    }; 

谢谢你的好意

回答

1

问题: -当您切换片段回来定时器片段的的onCreate生命周期回调将被调用,并且走了重置计时器

customHandler.postDelayed(updateTimerThread,0);

解决方案: -移动定时器逻辑到活动类,但活动将定向变化来重新使移动定时器逻辑到应用类: -

放弃这一类在你的项目包

import java.text.SimpleDateFormat; 
import java.util.Date; 

import android.app.Application; 
import android.os.Handler; 
import android.widget.Toast; 

public class App extends Application { 

    public static App appInstance; 
    private SimpleDateFormat dateFormat; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     appInstance = this; 

     dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
    } 

    public void afficher() { 
     Toast.makeText(getBaseContext(), dateFormat.format(new Date()), 300).show(); 
     handler.postDelayed(runnable,1000); 
    } 

    public void startTimer() { 
     runnable.run(); 
    } 

    public void stopTimer() { 
     handler.removeCallbacks(runnable); 
    } 

    Handler handler = new Handler(); 
    Runnable runnable = new Runnable() { 
     public void run() { 
      afficher(); 
     } 
    }; 

} 

设置您的应用程序名称应用程序类别像这样下面(android名称属性的应用程序): -

<application 
     android:name="com.masterdetail_webview.App" 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.masterdetail_webview.TimertestActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

现在你可以就从任何地方

findViewById(R.id.button1).setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      App.appInstance.startTimer(); 

     } 
    }); 

    findViewById(R.id.button2).setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      App.appInstance.stopTimer(); 

     } 
    }); 

添加AppController的

停止计时器只是这样

enter image description here

+0

的Java郎空指针异常,当我打电话App.appInstance.startTimer( ); 对不起,我在android新手:( –

+0

你必须申报清单中的应用程序名称请参阅编辑参考 <应用程序 android:name =“<您的包名> .App” –

+0

这是一个很好的解决方案将逻辑移到应用程序范围,如果他需要在片段中显示时间的问题,因为你需要访问片段的ui。我认为将startTimer()更改为startTimer(Hanlder处理函数)并在片段中实现处理程序会更好 –