【发布时间】:2018-06-27 04:52:10
【问题描述】:
我需要在 2 分钟后调用一个方法。我已经尝试过处理程序和计时器,但是当应用程序关闭时它不起作用。然后我在服务中有呼叫计时器并在按钮单击时启动服务并在 2 分钟后停止服务。它可以工作,但问题是有时服务会调用自己。下面是我的代码。
我的服务类
public class MyService extends Service {
private static Retrofit retrofit = null;
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
new CountDownTimer(120000, 1000) {
public void onTick(long millisUntilFinished) {
Log.d("message", "start");
}
public void onFinish() {
Log.d("message", "finish");
callMyMethod();
stopService(new Intent(MyService.this, MainActivity.class));
}
}.start();
}
我开始服务的 MainActivity 类。
stopService(new Intent(getContext(), MyService.class));
startService(new Intent(getContext(), MyService.class));
清单
<service android:name="MyService" android:enabled="true" android:exported="true"/>
注意:我只想在按钮单击时调用服务并在 2 分钟后停止服务。 请需要帮助来解决这个问题,或者如果除了服务之外还有其他好的解决方案。
更新:如果网络响应不成功,我该如何处理重试。
我的服务类
public class MyService extends Service {
private static Retrofit retrofit = null;
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
new CountDownTimer(120000, 1000) {
public void onTick(long millisUntilFinished) {
Log.d("mess", "start");
}
public void onFinish() {
Log.d("mess", "finish");
selectDriverForJOb();
stopSelf();//(new Intent(MyService.this, MainActivity.class));
}
}.start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_NOT_STICKY;
}
private void selectDriverForJOb() {
SharedPreferences sharedPreferences = getSharedPreferences("Login_credentials", MODE_PRIVATE);
String user_id = sharedPreferences.getString("userID", null);
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
APIServices_interface selectDriver_interface = retrofit.create(APIServices_interface.class);
Call<SelectDriverforJobResult> call = null;
try {
call = selectDriver_interface.selectDriverforJob(user_id);
} catch (Exception e) {
e.printStackTrace();
}
if (call != null) {
try {
call.enqueue(new Callback<SelectDriverforJobResult>() {
@Override
public void onResponse(Call<SelectDriverforJobResult> call, Response<SelectDriverforJobResult> response) {
SelectDriverforJobResult selectDriver = response.body();
String message = selectDriver.getMessage();
if(!(message.equalsIgnoreCase("success"))){
}
}
@Override
public void onFailure(Call<SelectDriverforJobResult> call, Throwable t) {
Log.d("mess : ", "Error Updating ");
//want to retry
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
【问题讨论】:
-
使用异步任务在异步任务中使用处理程序或倒计时
-
@Nilesh Rathod 它不重复。我已经检查过这个问题。这并没有解决我的问题。
-
@VinodMaurya 在按钮单击时从主要活动调用服务。
-
如果用户第一次点击按钮并且服务启动并关闭应用程序怎么办? 2分钟后你还需要执行任务吗?
-
好的!所以服务不是这种情况的解决方案,正如我在下面的答案中已经提到的那样。这显然是
AlarmManager或JobShedular的用例。由于您需要 Internet 连接,因此最好使用JobShedular。你可以试试WorkManager,它是JobShedular的一个包装器,适用于所有操作系统版本。