Android: AsyncTask более приоритетный, чем Сервис - PullRequest
0 голосов
/ 23 июня 2018

Служба и AsyncTask работают одновременно. Внутри службы происходит сохранение данных на сервере. В AsyncTask происходит получение данных из другого источника и обновление пользовательского интерфейса.

Пользовательский интерфейс не обновляется до тех пор, пока не будет выполнена задача внутри Сервиса, после чего отображается пользовательский интерфейс

protected List<AppItem> doInBackground(MyTaskParams... integers) {
            android.os.Process.setThreadPriority(THREAD_PRIORITY_BACKGROUND + THREAD_PRIORITY_MORE_FAVORABLE);

Я использовал приведенный выше код для asynctask, но он не работает, как я могу дать больше преимуществ AsyncTask, чем Service

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

По умолчанию Service выполняется в главном потоке.

Помните, что если вы используете службу, она по-прежнему работает в главном потоке вашего приложения по умолчанию, поэтому вам все равно следует создатьновый поток в службе, если он выполняет интенсивные или блокирующие операции.

https://developer.android.com/guide/components/services?hl=en#should-you-use-a-service-or-a-thread

Похоже, вы сначала запускаете Service, а затем запускаете AsyncTask.Поскольку служба работает в потоке Main, ваша AsyncTask не запускается до тех пор, пока не завершится.

Обновление

Существует множество решений, и выбор зависит от требований.Похоже, в вашем случае самый простой способ достижения параллелизма - использовать IntentService.Таким образом, вы можете запустить IntentService и AsyncTask с вашего Activity.

public class MyIntentService extends IntentService 
{  

    private static final String TAG = this.getClass().getSimpleName();

    public MyIntentService() {
        super("MyIntentService");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
    {
        super.onStartCommand(intent, flags, startId);
        Log.d(TAG, "MyIntentService Started");
        // This thing still happens on ui thread

        return START_NOT_STICKY;
    }

    @Override
    protected void onHandleIntent(Intent intent) 
    {
        Log.d(TAG, "MyIntentService Handling Intent");
        // Your work should be here, it happens on non-ui thread
    }
}

https://developer.android.com/reference/android/app/IntentService

0 голосов
/ 23 июня 2018

используйте этот кусок кода вместо

 Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
...