onProgressUpdate () для класса AsyncTask не работает - PullRequest
0 голосов
/ 09 мая 2019

Я хочу показать прогрессбар, где загружено изображение, и установить собственный цвет Я делаю это в onProgressUpdate (), но он не работает, он также не отображается в logcat. Он также отображает белый экран до завершения загрузки, и если я нажму кнопку «Назад» во время загрузки, произойдет сбой.

мой код:

public class DownloadImage extends AsyncTask<String ,Void, Bitmap> {

    Bitmap bit;

    @Override
    protected Bitmap doInBackground(String... urls) {
        try {
            URL url = new URL(urls[0]);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            return BitmapFactory.decodeStream(connection.getInputStream());
        } catch(Exception e){
            Log.i("error download", "doInBackground: "+e.getMessage());
        }
        return null;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        Log.i("download", "onPostExecute: ");
        imageView.setImageBitmap(bitmap);
        progressBar.setVisibility(View.GONE);
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        Log.i("download", "onProgressUpdate: ");
        imageView.setColorFilter(R.color.imagecolor);
    }
}

и метод onCreate ():

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main3);
    imageView = findViewById(R.id.imageView2);
    progressBar = findViewById(R.id.progressBar2);
    DownloadImage downloadImage = new DownloadImage();
    downloadImage.execute("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRaL6woz3RgMF-UXU682S_BYb1ayl5xaVancp0PPvF2HnCDmPsb");

    try {
        downloadImage.get();
    } catch (Exception e){

    }
}

1 Ответ

3 голосов
/ 09 мая 2019

Я хочу показать прогрессбар, где загружено изображение, и установить собственный цвет. Я делаю это в onProgressUpdate (), но это не работает

Вам нужно вызвать publishProgress() из doInBackground().Это вызовет звонки на onProgressUpdate().Вы этого не делаете, и поэтому onProgressUpdate() не будет вызываться.

также показывает белый экран до завершения загрузки

Удалите ваш downloadImage.get(); вызов.Это заблокирует основной поток приложения, и смысл использования AsyncTask (или его более современных замен) состоит в том, чтобы не блокировать основной поток приложения.

и если я нажму кнопку возврата во время загрузки, это приведет к сбою.

Если действие / фрагмент уничтожен, вы не должны обновлять интерфейс.Таким образом, вам необходимо подтвердить в onPostExecute(), безопасно ли обновлять пользовательский интерфейс (например, вызвать isDestroyed() для действия).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...