Android сохраняет ImageView в состоянии приложения - PullRequest
0 голосов
/ 17 июня 2011

Я создал приложение для Android, которое получает XML-фид (от веб-сайта), проходит через него и отображает изображения в фиде.

Я использую «Галерея» и «Адаптер изображения» для отображения всех изображений - загружаю их с веб-сайта (поскольку фид предоставляет URL)

Но когда телефон меняет ориентацию, приложение переустанавливается, и состояние теряется, что приводит к повторному потреблению канала и повторной загрузке изображений (что очень сильно влияет на пропускную способность)

В ImageAdapter я создал массив объектов ImageView, который позволяет мне сохранять изображения, загруженные с веб-сайта, на локальном объекте (чтобы не загружать их снова)

Но поскольку приложение переустанавливается каждый раз, когда телефон меняет ориентацию, массив объектов стирается, и все снова загружает резервную копию.

Я пытаюсь сохранить этот массив ImageView в состоянии приложения, но не могу найти нужную функцию ???

Вот код:

package com.test;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.Toast;


public class ImageAdapter extends BaseAdapter {
    private Context mContext;

    private String[] mImageIds = {};
    private String[] titles = {};
    public ImageView[] images = {};

    public ImageAdapter(Context c) {
        mContext = c;

        try{
            //open local file and parse to XML  
            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
            Document doc;

            doc = docBuilder.parse(mContext.openFileInput("xmlfeed.xml"));
            doc.getDocumentElement().normalize();

            NodeList itms = doc.getElementsByTagName("item");
            String temp = "";
            String tempTitles = "";

            //loop through xml items to retreive all nodes
            for (int i = 0; i < itms.getLength(); i++){
                Node itm = itms.item(i);
                if(temp==""){
                    temp = getTagValue(itm, "image");
                    tempTitles = getTagValue(itm, "title");
                }else{
                    temp = temp + "," + getTagValue(itm, "image");
                    tempTitles = tempTitles + "," + getTagValue(itm, "title");
                }
            }
            mImageIds = temp.split(",");
            titles = tempTitles.split(",");

            //create all images as empty vars
            if(images.length==0){
                images = new ImageView[itms.getLength()];
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    public int getCount() {
        return mImageIds.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        //loads the image in case it does not already exists in the object
        if(images[position]==null){
            ImageView imgs = new ImageView(mContext);
            try{
                imgs.setImageDrawable(drawable_from_url(mImageIds[position], "src"));
            }catch(Exception e){
                e.printStackTrace();
            }
            imgs.setScaleType(ImageView.ScaleType.FIT_XY);
            images[position] = imgs;
        }
        return images[position];
    }

    Drawable drawable_from_url(String url, String src_name) throws java.net.MalformedURLException, java.io.IOException{
        Toast.makeText(mContext, url, Toast.LENGTH_SHORT).show();
        return Drawable.createFromStream(((java.io.InputStream)new java.net.URL(url).getContent()), src_name);
    }

    public String getTagValue(Node itm, String tagName){
        String title_value = "";
        if (itm.getNodeType() == Node.ELEMENT_NODE)
        {
            Element itmElm = (Element) itm;
            NodeList title = itmElm.getElementsByTagName(tagName);
            Element titleElm = (Element) title.item(0);
            NodeList title_nodes = titleElm.getChildNodes();
            title_value = ((Node) title_nodes.item(0)).getNodeValue().trim();
        }
        return title_value;
    }
}

Пожалуйста, помогите, как мне сохранить это в App State ???

1 Ответ

0 голосов
/ 17 июня 2011

Это потому, что ваш просмотр списка определен внутри метода oncreate () упражнения A. Выполните следующие действия для этого действия, чтобы сделать ваш UIfreeze в ориентации экрана

Добавьте следующее в объявление действия в манифесте:

android:configChanges="orientation"

так выглядит

<activity android:label="@string/app_name" 
        android:configChanges="orientation|keyboardHidden" 
        android:name=".your.package">

Дело в том, что система уничтожает активность при изменении конфигурации.

Спасибо Deepak

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