. При преобразовании списка в набор удаляются повторяющиеся элементы. Поэтому, если длина преобразованного набора равна 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
Это будет сравнивать (эквивалентность) первый элемент списка ввода со всеми остальными элементами в списке. Если все эквиваленты 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].
Почему бы просто не использовать SharedPreferences вместо singleton?
В любое время, когда вы хотите сохранить какое-либо глобальное состояние, передайте его предпочтениям. В любое время, когда вы хотите прочитать глобальное состояние, прочитайте его из настроек.
Тогда вам вообще не придется заниматься жизненным циклом приложения, так как ваши данные всегда будут сохранены независимо от того, что делает телефон.
Для чего-то подобного я использовал псевдоселетон-объект в качестве класса 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();
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);
}
}
}
isInstanceAvailable
в вашем одиночном тоне), если он есть, то вы его захватываете, если это не тогда, вы воссоздаете это из объекта, хранящегося на диске. Но это может быть несколько неэлегантное решение вашей проблемы (сериализация, как сообщается, медленная на Android), и я должен признать, что я не специалист по этому вопросу :)
– soren.qvist
26 October 2012 в 22:38