Android Oreo - Job Intent Service работает в главном потоке, вызывая зависание приложения на пару секунд - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь загрузить какой-нибудь файл в фоновом режиме. Ранее я работал с сервисом интентов, и мое приложение не зависало при использовании сервиса интентов. Но, как и в случае с Oreo и более поздними версиями, служба Intent разрушается, как только приложение закрывается из фона. Та же самая обработка, которую я сделал в сервисе Job, но кажется, что он работает в основном потоке. Что я должен сделать для фоновой обработки, которая не должна выполняться в главном потоке?

Ниже приведен код для планирования работы, который я сделал:

public class Util {

    // schedule the start of the service every 10 - 30 seconds
    @TargetApi(Build.VERSION_CODES.M)
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public static void scheduleJob(Context context) {
        ComponentName serviceComponent = new ComponentName(context, MyService.class);
        JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
        builder.setMinimumLatency(1 * 1000); // wait at least
        builder.setOverrideDeadline(3 * 1000); // maximum delay
        //builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); // require unmetered network
        //builder.setRequiresDeviceIdle(true); // device should be idle
        //builder.setRequiresCharging(false); // we don't care if the device is charging or not
        JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
        jobScheduler.schedule(builder.build());
    }

}



@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class MyService extends JobService {
    private static final String TAG = "SyncService";
    public Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
    public SharedPreferences sharedPreferences;
    public ComplexObject complexObject;
    private Context context;
    public static final String NOTIFICATION_CHANNEL_ID = "10001";
    @Override
    public boolean onStartJob(JobParameters params) {
        System.out.println("RUnning this Job.......");
        context = this;
        this.sharedPreferences = context.getSharedPreferences(context.getResources().getString(R.string.shared_preference_key), Context.MODE_PRIVATE);

        //30-40 HTTP call to process the data
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return true;
    }

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Не уверен, поможет ли это вам, так как оно довольно старое, но:
Ваш заголовок гласит JobIntentService, и вы используете JobService, ответ TheWanderer относится к вашему используемому классу (JobService), но если вы будете использовать JobIntentService, его метод onHandleWork выполняется в фоновом потоке:

Этот метод вызывается в фоновом потоке, поэтому вы можете выполнять здесь длительные операции блокировки.

0 голосов
/ 09 ноября 2018

По документам:

Этот сервис выполняет каждое входящее задание в обработчике, запущенном в главном потоке вашего приложения. Это означает, что вы должны перенести логику выполнения в другой поток / обработчик / AsyncTask по вашему выбору. Невыполнение этого требования приведет к блокировке любых будущих обратных вызовов из JobManager, в частности, onStopJob (android.app.job.JobParameters), который предназначен для информирования вас о том, что требования к планированию больше не выполняются.

Итак, вам нужно использовать AsyncTask или какой-либо другой вид асинхронного метода для выполнения вашей логики. Вы должны использовать что-то отменяемое, хотя, поскольку, когда вызывается onStopJob(), вы должны прекратить все, что вы делаете.

Также не забудьте позвонить jobFinished(), когда ваша логика будет завершена.

...