【问题标题】:Thread Sleep in one Async Task pauses other Async taks in application一个异步任务中的线程睡眠暂停应用程序中的其他异步任务
【发布时间】:2016-04-06 15:57:13
【问题描述】:

假设我想在一个异步任务中休眠线程。

代码:

 protected Weather doInBackground(Void... params) {
       try {
                Thread.sleep(10000);
            } catch (Exception ex) {

            }
}

这会导致应用程序中的其他异步任务暂停。为什么? 我的意图不是暂停线程,而是网络调用需要一些时间,这会暂停应用程序中的所有异步任务。

如何解决这个问题?

这就是我调用异步任务的方式

WeatherAsync weatherAsync = new WeatherAsync(Pref.getString(getApplicationContext(), Pref.local.WEATHER_CITY), null, null,
                new WeatherAsync.WeatherAsyncCallback() {
                    @Override
                    public void onCancelled() {

                    }

                    @Override
                    public void onPreExecute() {

                    }

                    @Override
                    public void onPostExecute(Weather result) {
                        if (result == null) {
                            return;
                        }
                        Log.d("Temp", "" + result.getTemp());
                        //adapter.addWeather(new NavigationDrawerItem(result, NavigationDrawerItem.WEATHER_VIEW));
                    }
                });
        weatherAsync.execute();

【问题讨论】:

    标签: android multithreading asynchronous


    【解决方案1】:

    AsyncTask API 文档说明如下:

    首次引入时,AsyncTask 是在单个后台线程上串行执行的。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务在单线程上执行,以避免并行执行导致的常见应用程序错误。

    也就是说,如果您运行的是相对现代的 Android,您的 AsyncTasks 将发生在同一个线程中。从 API 文档继续:

    如果你真的想要并行执行,你可以使用 THREAD_POOL_EXECUTOR 调用 executeOnExecutor(java.util.concurrent.Executor, Object[])。

    这只是在 Android 上执行多线程操作的一种方式。您也可以使用普通的旧线程来实现多线程。

    【讨论】:

    • 谢谢,我不知道。我有加载 4 个碎片网的视图寻呼机。其中 2 个和主要活动执行总共 4 个异步任务。如果他们卡住了,那么一切都会卡住。如何解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 2012-08-06
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多