在Android上创建从Web Api获取数据并在事件发生时通知用户的经常性线程的最佳方法是什么?
我使用的是一个调用Intent Service的警报管理器,但看起来这不是最好的。它在系统重启时死亡。
有没有人有很好的重新计算?
答案 0 :(得分:0)
while(1>0){
Result r = getResultFromAPI(args);
processResults(r);
Thread.sleep(sleepTimeInMillis);
}
如果您有权修改服务,也可以将其设置为执行推送通知。
答案 1 :(得分:0)
这可以通过Android服务实现。
使用START_STICKY
的Android服务的好处我在位置跟踪应用中实现了此类。你可以粘贴和使用它。
package in.kpis.tracker.projectClasses.services;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* Created by KHEMRAJ on 1/24/2018.
*/
public class SyncLocationServiceSample extends Service {
public String TAG = "SyncLocationService";
private Thread mThread;
ScheduledExecutorService worker;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "onStartCommand");
super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
@Override
public void onCreate() {
super.onCreate();
if (worker == null) worker = Executors.newSingleThreadScheduledExecutor();
if (mThread == null || !mThread.isAlive()) {
mThread = new Thread(new Runnable() {
@Override
public void run() {
syncLocationAPI();
if (worker != null) {
// 60 * 1000 is 60 second, change it as your requirement.
worker.schedule(this, 60 * 1000, TimeUnit.MILLISECONDS);
}
}
});
mThread.start();
}
}
@Override
public void onDestroy() {
super.onDestroy();
stopThread();
}
boolean apiCalling = false;
private synchronized void syncLocationAPI() {
if (apiCalling) return;
// do your api call here.
// make apiCalling true when you call api, and apiCalling false when response come
}
private void stopThread() {
worker = null;
if (mThread != null && mThread.isAlive()) mThread.interrupt();
}
}
需要考虑的事项
您将使用设备启动完成接收器启动此服务。 How to make boot complete receiver。如果您需要帮助来开始服务,请告诉我。