java我需要从MainActivity取消在服务类中启动的计时器,但获取null引用异常
我有一个服务类型类,它在onCreate方法中启动timertask,当用户按下按钮时,我需要从MainActivity停止计时器。我知道我必须在我的服务中保留对计时器的引用,但我不知道如何做,需要一些帮助,请
请看一下我的代码
package com.example.timertest;
import 安卓.content.Intent;
import 安卓.support.v7.app.AppCompatActivity;
import 安卓.os.Bundle;
import 安卓.view.View;
import 安卓.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
button.setOnClickListener(this);
startService(new Intent(this, TimeService.class));
}
@Override
public void onClick(View v) {
if(v.getId() == R.id.button){
// i need here to call mTimer.cancel() in TimeService.class
//
}
}
}
//这是TimeService。爪哇
package com.example.timertest;
import 安卓.app.Service;
import 安卓.content.Intent;
import 安卓.os.Handler;
import 安卓.os.IBinder;
import 安卓.support.annotation.Nullable;
import 安卓.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimeService extends Service {
public Timer mTimer;
private Handler mHandler = new Handler();
long NOTIFY_INTERVAL = 60 * 1000 * 1; // 1 min
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
if (mTimer != null) {
mTimer.cancel();
} else {
mTimer = new Timer();
}
mTimer.scheduleAtFixedRate(new RefreshDataTimerTask(), 0, NOTIFY_INTERVAL);
}
class RefreshDataTimerTask extends TimerTask {
@Override
public void run() {
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), getDateTime(), Toast.LENGTH_LONG).show();
}
});
}
private String getDateTime() {
SimpleDateFormat sdf = new SimpleDateFormat("[yyyy/MM/dd - HH:mm:ss]");
return sdf.format(new Date());
}
}
}
//在清单中注册的文件和服务
<service 安卓:name=".TimeService"/>
我试着打电话给mTimer。cancel(),但得到一个空引用,因为我似乎已经创建了服务类的新实例
这个例子展示了一个每分钟都有日期和时间的祝酒词,我想当15秒过去,我按下按钮时,计时器将被取消,并从一开始再次开始计数60秒。在这个服务中,我有很多其他的东西,比如通知、频道、共享首选项等等,所以如果我只能使用timer对象,那就太好了
# 1 楼答案
看看这个{a1}和{a2}。这里有一个示例,说明了在您可以直接访问服务方法之后如何
bind
为活动提供服务成功绑定后,您可以在服务中添加方法以停止计时器:
并从
Activity
调用此方法# 2 楼答案
这可能不是最佳做法,但您可以通过直接引用类来访问公共值:
这应该可以工作,因为服务的功能类似于单例,因为startService的每个调用都应该调用同一个实例