Android:AsyncTask比服务优先级更高

时间:2018-06-23 11:56:04

标签: android android-studio android-asynctask android-service thread-priority

我同时运行一个Service和AsyncTask,在服务内部,将数据存储在服务器中,在AsyncTask中,从另一个源获取数据并更新UI。

在显示该UI后,直到服务内部的任务完成,UI才会更新

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

我将上述代码用于asynctask,但无法正常工作,我该如何优先于AsyncTask而不是Service

2 个答案:

答案 0 :(得分:2)

改用这段代码

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

答案 1 :(得分:1)

默认情况下,Service在主线程上运行。

  

请记住,如果您确实使用了一项服务,该服务仍会在您的   应用程序的主线程默认情况下,因此您仍应创建一个新的   服务中的线程(如果它执行密集或阻塞)   操作。

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

似乎您先启动Service,然后再运行AsyncTask。由于该服务在Main线程中运行,因此您的AsyncTask在完成之前不会启动。

更新

有很多解决方案,选择取决于要求。在您看来,实现并发的最简单方法是使用IntentService。因此,您可以从IntentService开始AsyncTaskActivity

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