Изменение цвета на клике [дубликат]

Вот два простых способа сделать это

, используя set ()

. При преобразовании списка в набор удаляются повторяющиеся элементы. Поэтому, если длина преобразованного набора равна 1, это означает, что все элементы одинаковы.

len(set(input_list))==1

Вот пример

>>> a = ['not', 'the', 'same']
>>> b = ['same', 'same', 'same']
>>> len(set(a))==1  # == 3
False
>>> len(set(b))==1  # == 1
True

, используя all ()

Это будет сравнивать (эквивалентность) первый элемент списка ввода со всеми остальными элементами в списке. Если все эквиваленты True будут возвращены, в противном случае возвращается False.

all(element==input_list[0] for element in input_list)

Вот пример

>>> a = [1, 2, 3, 4, 5]
>>> b = [1, 1, 1, 1, 1]
>>> all(number==a[0] for number in a)
False
>>> all(number==b[0] for number in b)
True

PS Если вы проверяете, соответствует ли весь список определенному значение, вы можете suibstitue значение in для input_list [0].

4
задан Tim 26 October 2012 в 22:10
поделиться

3 ответа

Почему бы просто не использовать SharedPreferences вместо singleton?

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

Тогда вам вообще не придется заниматься жизненным циклом приложения, так как ваши данные всегда будут сохранены независимо от того, что делает телефон.

4
ответ дан Tim 19 August 2018 в 07:54
поделиться
  • 1
    Это, безусловно, будет, я буду оценивать это завтра и давать отзывы, если он работает для меня :) Мне очень нравится идея не иметь дело с жизненным циклом приложения – Tim 26 October 2012 в 22:43
  • 2
    SharedPreferences не универсальная утилита. В моем случае у меня есть 100 тыс. Структурированных данных и изображений. Чтобы сохранить / загрузить через SharedPreferences, это не очень хорошая идея - я пробовал, но загрузка занимает 10 секунд. – Kostadin 22 November 2012 в 11:03

Для чего-то подобного я использовал псевдоселетон-объект в качестве класса Application . Этот объект будет создан в начале и будет находиться в памяти. Но учтите, что система прекратит приложение, если память понадобится другим приложениям. Однако этот объект является постоянным, даже если все действия временно завершены.

Чтобы использовать это, вам нужно объявить, что в вашем манифесте android как здесь:

<application android:label="@string/app_name"
             android:icon="@drawable/icon"
             android:description="@string/desc"
             android:name=".MySingeltonClass"
             ...

Вот пример кода :

public abstract class MySingeltonClass extends Application {
    // ...

    public void informClientOnline() {
        clientOnline=true;
        Log.v(LOG_TAG, "Client is online!");
    }

    public void informClientShutdown() {
        clientOnline=false;
        Log.v(LOG_TAG, "Client is going offline. Waiting for restart...");
        Timer t=new Timer("shutdowntimer", false);
        t.schedule(new TimerTask() {
            @Override
            public void run() {
                if(!clientOnline) {
                    Log.v(LOG_TAG, "Client has not restartet! Shutting down framework.");
                    shutdown();
                    System.exit(0);
                }
            }
        }, 5000);
    }
}

эти две функции вызываются так:

((MySingeltonClass)getApplicationContext()).informClientOnline();
0
ответ дан rekire 19 August 2018 в 07:54
поделиться
  • 1
    «Система будет завершена». часть - это точно моя проблема, так как мне нужен способ воссоздать объект после этого. – Tim 26 October 2012 в 22:09
  • 2
    Мое решение состояло в том, чтобы вызвать oncreate метод here am i и метод good by в ondestroy ... Я добавлю пример. – rekire 26 October 2012 в 22:11
  • 3
    @Tim Я добавил пример. – rekire 26 October 2012 в 22:18
  • 4
    Спасибо, однако я не вижу, как это помогает восстановить мой синглтон (хорошо, я думаю, вы имеете в виду, что мой синглтон должен просто быть этим объектом приложения. Теперь обратите внимание на ту часть, что данные должны быть заполнены вызовом webservice. закрыт, снова открыт, объект приложения будет создан, я могу запланировать мой вызов webservice, но тогда моя активность открыта, а вызов еще не закончен, я получаю плохой макет). – Tim 26 October 2012 в 22:25
  • 5
    Объект приложения будет существовать, даже если временно все действия будут закрыты. Вот почему я проверяю это вручную и сохраняю, чем все пользовательские состояния в моем методе shutdown(). – rekire 26 October 2012 в 22:27

Вы можете сохранить свой Синглтон, когда onSaveInstanceState() в вызове Activity вызывается. Все, что вам нужно сделать, это сделать его Parcelable (это андроиды собственной формы сериализации), то вы можете поместить его в outState Bundle в onSaveInstanceState(), который позволит вам чтобы получить его в onCreate() или onRestoreInstanceState() в Деятельности, в зависимости от того, что вам нравится.

Я привел пример для вас:

public class TestActivity extends Activity {

    private MySingleton singleton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState.containsKey("singleton")) {
            singleton = savedInstanceState.getParcelable("singleton");
        } else {
            singleton = MySingleton.getInstance(5);
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelable("singleton", singleton);
    }

    public static class MySingleton implements Parcelable {

        private static MySingleton instance;
        private int myData;

        private MySingleton(int data) {
            myData = data;
        }

        public static MySingleton getInstance(int initdata) {
            if(instance == null) {
                instance = new MySingleton(initdata);
            }

            return instance;
        }

        public static final Parcelable.Creator<MySingleton> CREATOR = new Creator<TestActivity.MySingleton>() {

            @Override
            public MySingleton[] newArray(int size) {
                return new MySingleton[size];
            }

            @Override
            public MySingleton createFromParcel(Parcel source) {
                return new MySingleton(source.readInt());
            }
        };

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel parcel, int flags) {
            parcel.writeInt(myData);
        }

    }

}
0
ответ дан soren.qvist 19 August 2018 в 07:54
поделиться
  • 1
    Тогда что будет с более чем одной деятельностью? Я думаю, что синглтон будет сохранен / сериализован независимо (возможно, разными значениями), и с каждым onCreate я меняю свой синглтон на что-то другое (что приводит к несогласованному состоянию) – Tim 26 October 2012 в 22:16
  • 2
    Ваш синглтон не может находиться в другом состоянии в каждом действии, если это истинный синглтон. Это один и тот же объект во всем мире, поэтому он синглтон :) – soren.qvist 26 October 2012 в 22:26
  • 3
    Да, но если я сериализую свой синглтон, я вроде как «замораживаю». это, верно? Теперь предположим, что одно действие открывает активность, которая открыта только на короткое время (например, диалог). После закрытия этой диалоговой деятельности она сохраняет свое состояние, не так ли? Сейчас через десять минут основная активность сохраняет свое состояние (так состояние 10 минут спустя). После того, как приложение будет убито и вернется к жизни, основное действие восстановит синглтон. Но когда диалог вернется, он восстановит состояние 10мин раньше, не так ли? – Tim 26 October 2012 в 22:30
  • 4
    Ладно, конечно, я вижу твою проблему. Вы можете выполнить сериализацию (Parcelable не поддерживает запись объекта на диск), который всегда сохраняет объект в том же файле. Затем, когда ваша деятельность воссоздана, вы проверяете, существует ли экземпляр вашего синглтона (что-то вроде логического метода isInstanceAvailable в вашем одиночном тоне), если он есть, то вы его захватываете, если это не тогда, вы воссоздаете это из объекта, хранящегося на диске. Но это может быть несколько неэлегантное решение вашей проблемы (сериализация, как сообщается, медленная на Android), и я должен признать, что я не специалист по этому вопросу :) – soren.qvist 26 October 2012 в 22:38
Другие вопросы по тегам:

Похожие вопросы: