AsyncTask, вызванный из обработчика, не будет выполнять doInBackground

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

В настоящее время существует фоновая задача (AsyncTask )для периодического получения новых изображений.

Я не получаю никаких сообщений об ошибках о неправильном потоке и т. д., просто второй экземпляр AsyncTasks не запускает метод doInBackground.

Вот некоторый код из Activity:

private DownloadTask mDownloadTask = null;
private Handler mHandler;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if(mDownloadTask != null) {
                mDownloadTask.cancel(true);
            }
            mDownloadTask = new DownloadTask();
            mDownloadTask.execute((Void[]) null);
        }
    };

    mDownloadTask = new DownloadTask();
    mDownloadTask.execute((Void[]) null);
}

DownloadTaskвыглядит так:

@Override
protected List doInBackground(Void... voids) {
     // Download list of URLs from server, etc.
}

@Override
protected void onPostExecute(List urls) {
    mHandler.sendEmptyMessageDelayed(111, 5000);
}

Будет вызван обработчик, onPreExecute (в AsyncTask )и начальный запуск DownloadTask (прямо вonCreate)тоже работает.

Согласно этому вопросу:Android SDK AsyncTask doInBackground не выполняет подкласс (), это может быть связано с SDK15.

Спасибо за любые подсказки.


Обновление Поскольку я получил комментарии о том, что обработчик может не находиться в потоке пользовательского интерфейса (, что странно, поскольку Thread.currentThreadодинаков как в методе onCreate, так и в методе обработчиков handleMessage, я пересмотрел handleMessageспособ:

mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if(mDownloadTask != null) {
                    mDownloadTask.cancel(true);
                }
                mDownloadTask = new DownloadTask();
                mDownloadTask.execute((Void[]) null);
            }
        });
    }
};

Все еще безуспешно.


Обновить полный класс DownloadTask

class DownloadTask extends AsyncTask> {

    @Override
    protected void onPreExecute() {
        // Cancel the animation.
        if (mSlideshowAnimation != null) {
            mSlideshowAnimation.cancel(true);
        }

        mImageView1.setVisibility(View.GONE);
        mImageView2.setVisibility(View.GONE);
        animate(mProgressBar).alpha(1.0f).setDuration(500).start();

        Log.d(TAG, "Download preparation done.");
    }

    @Override
    protected List doInBackground(Void... voids) {
        Log.d(TAG, "Download");
        SharedPreferences s = getSharedPreferences("access", Context.MODE_PRIVATE);
        String token = s.getString("token", null);

        Log.d(TAG, "Downloading slideshows.");

        List urls = new ArrayList();
        Slideshow[] slideshows = new Api(SlideshowActivity.this).getSlideshows(token);
        for (Slideshow slideshow : slideshows) {
            urls.addAll(slideshow.getAllPhotoUrls());
        }

        Log.d(TAG, "Downloading slideshows: " + slideshows.length);

        for (String url : urls) {
            try {
                url = Api.HOST + url;

                if (!Cache.fileExists(Cache.getCacheFilenameForUrl(SlideshowActivity.this, url))) {
                    Cache.cacheStream(SlideshowActivity.this, HttpHelper.download(SlideshowActivity.this, url), url);
                } else {
                    Log.d(TAG, "Cached: " + url);
                }
            } catch (IOException e) {
                Log.e(TAG, "Error while downloading.", e);
            }
        }

        Log.d(TAG, "Downloading slideshows finished.");

        return urls;
    }

    @Override
    protected void onPostExecute(List urls) {
        Log.d(TAG, "download successful");
        animate(mProgressBar).alpha(0.0f).setDuration(500).start();

        mCurrentImageIndex = -1;
        mImageUrls = urls;

        mSlideshowAnimation = new SlideshowAnimation();
        mSlideshowAnimation.execute((Void[]) null);

        mHandler.sendEmptyMessageDelayed(111, 5000);
    }
}

12
задан Community 23 May 2017 в 12:23
поделиться