Кеширование ифонрмации

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
Alibard
Сообщения: 70
Зарегистрирован: 20 янв 2015, 19:48

Кеширование ифонрмации

Сообщение Alibard » 14 май 2015, 20:46

Я качаю из интернета картинки через лоадер в потоках. Но при смене ориентации екрана картинки пропадают. Вот код

Код: Выделить всё

package com.example.loader;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Pair;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TableRow;
import android.widget.Toast;

public class MainActivity extends Activity {

	//Ссылки на изображения для загрузки
	public static final String[] imagesUrls = {
		"http://bomba.vn.ua/sites/default/files/styles/200x200/public/_dsc0072.jpg?itok=ORAFJotr",
		"http://bomba.vn.ua/sites/default/files/styles/200x200/public/_dsc0104.jpg?itok=Peitxl1w",
		"http://bomba.vn.ua/sites/default/files/styles/200x200/public/_dsc0119.jpg?itok=W54uY3Lk"
	};

	private ArrayList imageViews = new ArrayList();
	private ProgressBar progressBar;
	private AsyncImagesLoader loader;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setUpViews();
    }

    public void startLoading(View view) {
    	if (loader == null ||
    				loader.getStatus().equals(AsyncTask.Status.FINISHED)) {
    		loader = new AsyncImagesLoader();
    		loader.execute(imagesUrls);
    		progressBar.setProgress(0);
    	} else {
    		Toast.makeText(MainActivity.this, "Ждите завершения загрузки", Toast.LENGTH_SHORT)
			.show();
    	}
    }

	private void setUpViews() {
		TableRow imagesRow = (TableRow)findViewById(R.id.images);
        for (int i = 0; i < imagesRow.getChildCount(); i++) {
        	imageViews.add((ImageView) imagesRow.getChildAt(i));
        }
        progressBar = (ProgressBar)findViewById(R.id.loading_progress);
	}

	//AsyncTask параметризуется:
	//входной параметр - строки, представляют url
	//параметр прогресса - пара вида: позиция виджета+изоборажение для него
	//параметр результат - Void, он нам не нужен
	private class AsyncImagesLoader extends AsyncTask <String, Pair<Integer, Bitmap>, Void> {
		protected Void doInBackground(String... urls) {
			for (int i = 0; i < urls.length; i++) {
				try {
					Bitmap image = getImageByUrl(urls[i]);
					//Добавим засыпание потока, чтобы симиритовать долгую загрузку
					Thread.sleep(400);
					Pair pair = new Pair(i, image);
					publishProgress(pair);
				} catch (IOException e) {
					Toast.makeText(MainActivity.this,
							"Не возможно загрузить изображение",
							Toast.LENGTH_SHORT).show();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			return null;
		}

		protected void onProgressUpdate(Pair ... progress) {
			int position = (int) progress[0].first;
			int currentProgress = position+1;
			Bitmap image = (Bitmap) progress[0].second;
			progressBar.setProgress(currentProgress);
			((ImageView) imageViews.get(position)).setImageBitmap(image);
		}

		protected void onPostExecute(Void result) {
			Toast.makeText(MainActivity.this, "Загрузка завершена", Toast.LENGTH_SHORT)
			.show();
		}

		private Bitmap getImageByUrl(String url) throws IOException,
														MalformedURLException {
			//Вот так можно получить изображение по url
			Bitmap image = BitmapFactory.decodeStream((InputStream)new URL(url).getContent());
			return image;
		}

	
	}
}
Подскажите форумчане как зделать так чтоб картинки сохранялись?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Кеширование ифонрмации

Сообщение doter.ua » 14 май 2015, 23:31

Можешь выбрать 1-2 часа мучений с либой Picasso и забыть про ручное кеширование.
1) http://square.github.io/picasso/
2) П.С. либа упоминается(краткая инструкция) в 161-м уроке http://startandroid.ru/ru/uroki/vse-uro ... casso.html
3) Если лень все менять можешь заморочиться с механизмом сохранения состояния. http://stackoverflow.com/a/151940
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Ответить