创建从Web API获取数据的循环线程的最佳方法?

时间:2018-04-13 17:52:03

标签: java android service alarm

在Android上创建从Web Api获取数据并在事件发生时通知用户的经常性线程的最佳方法是什么?

我使用的是一个调用Intent Service的警报管理器,但看起来这不是最好的。它在系统重启时死亡。

有没有人有很好的重新计算?

2 个答案:

答案 0 :(得分:0)

while(1>0){
    Result r = getResultFromAPI(args);
    processResults(r);
    Thread.sleep(sleepTimeInMillis);
}

如果您有权修改服务,也可以将其设置为执行推送通知。

答案 1 :(得分:0)

这可以通过Android服务实现。

使用START_STICKY

的Android服务的好处
  • 如果因任何原因停止,Android将负责再次启动您的服务。
  • 以下服务在工作线程上运行,永远不会挂起您的应用。
  • 获取数据api在进程中永远不会被调用两次。 (保持国旗)

我在位置跟踪应用中实现了此类。你可以粘贴和使用它。

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。如果您需要帮助来开始服务,请告诉我。