Мое приложение использует базу данных в 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?