Загрузка файла с помощью сервиса - PullRequest
0 голосов
/ 24 августа 2018

Чтобы загрузить некоторые файлы для множества видов деятельности, я подумал, что будет гораздо лучше объединить все одни и те же коды в одно действие, например (DownloadFiles.class), но здесь есть проблема. Я должен получить значение прогресса в моей основной деятельности (SetupActivity.class), это невозможно сделать с помощью AsyncTask. Оригинальный код был:

private class DownloadFiles extends AsyncTask<String, Integer, String> {
    private Context context;
    private PowerManager.WakeLock mWakeLock;

    public DownloadFiles(Context context) {
        this.context = context;
    }
    @Override
    protected String doInBackground(String... input_value) {
        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(input_value[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            int fileLength = connection.getContentLength();
            input = connection.getInputStream();
            output = new FileOutputStream(new File(input_value[1]));
            byte data[] = new byte[4096];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                if (isCancelled()) {
                    input.close();
                    return null;
                }
                total += count;
                if (fileLength > 0)
                    publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }
        } catch (Exception e) {
            return e.toString();
        } finally {
            try {
                if (output != null) output.close();
                if (input != null) input.close();
            } catch (IOException ignored){
                ignored.printStackTrace();
            }
            return "Download Complete.";
        }
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                getClass().getName());
        mWakeLock.acquire();
    }
    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
    }
    @Override
    protected void onPostExecute(String result) {
        mWakeLock.release();
        if (!result.equals("Download Complete.")) {

        } else {

        }
    }
}

Не удалось использовать onProgressUpdate для обработки индикатора выполнения других действий. Причина, по которой я не использую ProgressDialog , заключается в том, что он устарел, поэтому гораздо лучше использовать панель прогресса, которая не препятствует взаимодействию пользователя с пользовательскими интерфейсами.

Я слышал, что использование сервисов - один из ответов, но нет никаких способов обновить прогрессбар, насколько мне известно.

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Вы также можете передать значение обратного вызова в AsyncTask следующим образом:

private class DownloadFiles extends AsyncTask<String, Integer, String> {
private Context context;
private PowerManager.WakeLock mWakeLock;
private ProgressCallback mProgressCallback

public DownloadFiles(Context context, ProgressCallback callback) {
    this.context = context;
    mProgressCallback = callback
}

Затем вы создадите интерфейс, подобный следующему:

public interface ProgressCallback{ 

   void onProgressUpdate(int percentComplete);

Имейте все действия или фрагменты, которые должныпокажите прогресс реализации этого интерфейса, а затем вы можете вызвать из onProgressupdate в asyncTask:

@Override
protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        mProgressCallback.onProgressUpdate(progress[0])
    }

Вы можете настроить интерфейс и метод любым удобным вам способом.

0 голосов
/ 24 августа 2018

Как вы, возможно, знаете, службы запускаются в фоновом потоке, поэтому у вас нет шансов обновить индикатор выполнения.

Но, в качестве альтернативы, вы можете использовать индикатор выполнения в разделе уведомлений, например:как это делает YouTube при просмотре офлайн-видео или загрузке любых видео.

С другой стороны, ваша идея использовать один файл DownloadFiles.class превосходна.Так почему бы не позвонить, когда действия откроются и покажут индикатор выполнения, обновления и т. Д. И т. Д.

Сервис также не понадобится.

...