Отправка данных в пожарный магазин внутри рабочего в Android - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь отправить местоположение телефона каждые 15 минут в Firestore.

Я искал работников в Android, но то, что я прочитал, мой код не работает, так как они синхронны, и я звоню асинхронный метод для вызова firestore.

Также конкурс, который я получаю внутри рабочего, имеет тип MultiDexApplication и вызовет исключение при вызове mFusedLocationClient.getLastLocation()

Вот код для моего работника .

public class LocationWorker extends Worker {
    private final static String TAG = "LocationWorker";

    private FusedLocationProviderClient mFusedLocationClient;
    private Context mApplicationContext;
    private FirebaseFirestore mFireStoreRef;
    private String mCurrentUserID;

    public LocationWorker(@NonNull Context context, @NonNull WorkerParameters params) {
        super(context, params);
        mApplicationContext = getApplicationContext();
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(mApplicationContext);
        mFireStoreRef = FirebaseFirestore.getInstance();
        mCurrentUserID = "Patrick";

    }

    @NonNull
    @Override
    public Result doWork() {
        mFusedLocationClient.getLastLocation()
                .addOnSuccessListener((Activity) mApplicationContext, new OnSuccessListener<Location>() {
                    @Override
                    public void onSuccess(final Location location) {
                        // Got last known location. In some rare situations this can be null.
                        if (location != null) {

                            mFireStoreRef
                                    .collection("locations")
                                    .document(mCurrentUserID)
                                    .collection(DateFormat.getDateTimeInstance().format(new Date()))
                                    .add(location)
                                    .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                                        @Override
                                        public void onSuccess(DocumentReference documentReference) {
                                            Log.d(TAG, "Location added: " + location.toString());
                                        }
                                    });
                        }
                    }
                });
        return Result.success();
    }
}

Я не могу сделать асинхронные вызовы внутри рабочего. Но тогда мне интересно, как я могу узнать местоположение телефона каждые 15 минут для отправки в пожарную?

1 Ответ

0 голосов
/ 08 марта 2020

В конструктор Worker передан контекст. Если вы хотите использовать его напрямую, попробуйте сохранить его в WeakReference.

При использовании ListenableWorker поток зависит только от вас. В этом примере выполняется все внутри Runnable, созданного для нового потока, но вы можете выбрать другую стратегию, если она будет работать лучше для вас:

public class MyWorker extends ListenableWorker{

    private Context mContext;
    private FirebaseFirestore mDb;

    public MyWorker(Context context, WorkerParameters params){
        super(context, params);

        mContext = context; // Store the context passed into the worker
        mDb = FirebaseFirestore.getInstance();
    }

    @NonNull
    @Override
    public ListenableFuture<Result> startWork(){

        return CallbackToFutureAdapter.getFuture(new CallbackToFutureAdapter.Resolver<Result>() {
            @Nullable
            @Override
            public Object attachCompleter(@NonNull final CallbackToFutureAdapter.Completer<Result> completer)
                    throws Exception {

                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {

                        OnCompleteListener<DocumentReference> completeListener = new OnCompleteListener<DocumentReference>() {
                            @Override
                            public void onComplete(@NonNull Task<DocumentReference> task) {
                                if(task.isSuccessful()){
                                    // ...

                                    completer.set(Result.success());

                                }else{
                                    // Whether you return failure or retry here
                                    // depends on what makes the most sense for your situation
                                    completer.set(Result.failure());
                                }
                            }
                        };

                        Map<String, Object> data = new HashMap<>();
                        data.put("some_data", someData);

                        mDb.collection("myCollection")
                            .add(data)
                            .addOnCompleteListener(completeListener);
                    }
                };

                new Thread(runnable).start();

                return runnable;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...