установка приоритета JobIntentService - PullRequest
0 голосов
/ 08 октября 2019

Мое приложение использует базу данных в Firestore, которую я хотел бы обновить в фоновом режиме. Я пытался использовать JobIntentService для этой цели, вызывая мой метод update () в onHandleIntent () JobIntentService. Вот код:


import androidx.core.app.JobIntentService;

import android.content.Context;
import android.content.Intent;
import android.content.res.AssetManager;
import android.os.AsyncTask;
import android.os.Process;
import android.os.SystemClock;
//import android.support.annotation.NonNull;
//import android.support.v4.app.JobIntentService;
import android.util.Log;


import java.io.InputStream;
import java.util.List;

import static android.os.Build.VERSION_CODES.P;

public class TestJobIntentService extends JobIntentService {
    private static final String TAG = "ExampleJobIntentService";


    static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, TestJobIntentService.class, 123, work);
    } 

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
    }

    @Override
    protected void onHandleWork(Intent intent) {

        Log.d(TAG, "onHandleWork");    
        update();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }

    @Override
    public boolean onStopCurrentWork() {
        Log.d(TAG, "onStopCurrentWork");
        return super.onStopCurrentWork();
    }

    public void update(){
      // my code here
    }


}

Это действительно работает, но, к сожалению, делает приложение неприемлемо медленным. Например, получение некоторых данных из Firestore теперь занимает почти 30 секунд, по сравнению с долей секунды, когда обновление не было запущено.

Мне было интересно, есть ли способ установить приоритет JobIntentService немного ниже, и я нашел следующий ответ Как установить Priority of IntentService в Android на аналогичный вопрос для IntentService,Таким образом, казалось, что вставка строки кода

Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST); 

в соответствующем месте может помочь. Класс CommandProcessor в JobIntentService,

final class CommandProcessor extends AsyncTask<Void, Void, Void> {
            @Override
            protected Void doInBackground(Void... params) {
                GenericWorkItem work;

                if (DEBUG) Log.d(TAG, "Starting to dequeue work...");

                while ((work = dequeueWork()) != null) {
                    if (DEBUG) Log.d(TAG, "Processing next work: " + work);
                    onHandleWork(work.getIntent());
                    if (DEBUG) Log.d(TAG, "Completing work: " + work);
                    work.complete();
                }

                if (DEBUG) Log.d(TAG, "Done processing work!");

                return null;
            }
     }

, показался мне хорошим кандидатом для этого, поэтому я подумал, что могу перезаписать его в своем классе TestIntentService и вставить сюда приведенную выше строку кода. (На данный момент, я должен признать, что я совсем не уверен, что дополнительная строка действительно ссылается на поток, к которому AsyncTask откладывает свою работу. Но я решил попробовать.) Однако, глобальная переменная DEBUG из JobIntentServiceзащищен, поэтому этот подход не работает.

Кто-нибудь знает, можно ли получить доступ и установить приоритет JobIntentService?

...