Как создать Asynctask для загрузки звуков в менеджер на экране загрузки - PullRequest
2 голосов
/ 06 января 2012

Мои последние два вопроса были короткими и не подробными, поэтому я постараюсь изо всех сил в этот раз.У меня большая деки с 430 звуками.Он настолько большой, что мне нужно создать 2 звукорежиссера на некоторых устройствах.Во всяком случае, на экране загрузки я пытаюсь реализовать AsyncTask.Я обычно понимаю его типы и его 4 шага, но я не понимаю параметры.Вот простая AsyncTask для справки.

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    protected Long doInBackground(URL... urls) {

    }
    return null;
}

protected void onProgressUpdate(Integer... progress) {

}

protected void onPostExecute(Long result) {

}
}

Что мне нужно сделать в фоновом режиме, так это добавить звуки в мой менеджер следующим образом: SoundManager2.addSound (415, R.raw.rubber);

Пожалуйста, это мой третий вопрос, поэтому, если вам нужна ЛЮБАЯ другая информация, не стесняйтесь спрашивать, я буду следить за этой веткой в ​​течение следующих 20 минут и быстро отредактирую ее вместе с информацией!

1 Ответ

0 голосов
/ 06 января 2012

В приведенном вами примере ...

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {...}

Три типа URL, Integer и Long (известные как Params, Progress, Result), могут быть любыми.

Первый (URL) - это тип параметра, который вы должны передать методу .execute(<params>) вашего экземпляра AsyncTask.Точнее, когда вы посмотрите на метод doInBackground(), вы увидите URL..., что в основном означает, что он примет массив URL.Даже если вам нужно передать только один URL, вы все равно должны передать его как массив из одного элемента

URL[] myURLs = new URL[] {<comma-separated URLs here>};
new DownloadFilesTask().execute(myURLs);

В методе doInBackground(URL... urls) вы получаете доступ к URL s как urls[0], urls[1] и т. Д. Или что-то вроде for (URL u:urls).

Второй типовой тип в этом примере (Integer) - это тип, ожидаемый onProgressUpdate(Integer progress).Опять же, это должно быть передано в виде массива.Например, если вы загружаете 10 файлов, вызывайте его после загрузки каждого файла.Например, myProgress[0] = 1, чтобы указать, что один файл был успешно загружен.Это позволяет вам обновить какой-либо диалог прогресса.

Наконец, третий универсальный тип (Long) снова используется для внутреннего использования, и тип onDoInBackground(...) должен возвращаться и передаваться в onPostExecute(Long result).Обратите внимание, что это единственный результат, а не массив.В зависимости от того, каков ваш результат, будет зависеть от того, как onPostExecute() должен вести себя.

Как я уже сказал, вы можете использовать любые типы, включая универсальный Void (примечание заглавной буквы) ...

private class MyAysncTask extends AsyncTask<Void, Void, Void>

В этом случае вы ничего не передаете .execute() и, хотя вы все равно можете позвонить publishProgress() (позвонить onProgressUpdate()), вы не можете передать ему какие-либо данные.Точно так же onPostExecute не получит никаких фактических данных результата.

...