SORU
2 ŞUBAT 2011, ÇARŞAMBA


'faaliyetleri arasında veri paylaşmak için en iyi yol hangisi Android?

Ana faaliyeti uygulama boyunca kullanılan bir aktivite var ve elimizde çok sayıda var. İlk etkinlik verileri kullanmak mümkün olmak istiyorum 2 diğer faaliyetleri var. Şimdi böyle bir şey yapabileceğimi biliyorum:

GlobalState gs = (GlobalState) getApplication();
String s = gs.getTestMe();

Ancak değişkenleri bir sürü paylaşmak istiyorum ve biraz yukarıda gibi bunların kopyalarını oluşturma olmak istemiyorum bu yüzden oldukça büyük olabilir. Google dev site bu android üzerinde performans için tavsiye edilmez " diyerek bir makale okuduğumu hatırlıyorum bu nedenle orada doğrudan ve get ve set yöntemlerini kullanmadan değişkenleri değiştirmek için bir yol.

Bu yüzden herkes herhangi bir fikir var ya da daha iyi bir yol bilen varsa çok memnun olurum.

CEVAP
2 ŞUBAT 2011, ÇARŞAMBA


Burada most common ways to achieve this derleme:

  • Niyet içine veri göndermek
  • Tek bir sınıfı kullanın
  • Uygulama tek kullanın
  • Statik alanlar
  • WeakReferences HashMap
  • Nesneleri (sqlite, paylaş tercihleri, dosya, vb.) devam

TL;DR: veri paylaşımı: iki yolu vardır niyet var ekstra veri kaybına ya da başka bir yerde. tasarruf Eğer veriler temel öğeler ise, veya kullanıcı tanımlı nesneler Dizeleri: niyet ekstralar (kullanıcı tanımlı nesneleri uygulamak gerekir Parcelable) bir parçası olarak gönderin Eğer karmaşık nesneleri geçen varsa save başka bir yerde tek bir örneği ve erişim onlara başlatılan bir etkinlik.

Her bir yaklaşım uygulamak için bazı örnekler:

Niyet içine veri göndermek

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("some_key", value);
intent.putExtra("some_other_key", "a value");
startActivity(intent);

İkinci aktivite:

Bundle bundle = getIntent().getExtras();
int value = bundle.getInt("some_key");
String value2 = bundle.getString("some_other_key");

Bu yöntemi kullanınilkel veri veya Dizeleri geçirmeden. Ayrıca Serializable uygulayan nesneler iletebilirsiniz.

Cazip olsa da, iki kez Serializable kullanmadan önce düşünmek gerekir: bu hata eğilimli ve korkunç derecede yavaş. Yani genel olarak:uzak Serializable uzak durmümkünse. Eğer kullanıcı tanımlı karmaşık nesneleri geçirmek istiyorsanızParcelable arayüzü bir göz atın. Zor uygulamak için, ama Serializable göre hatırı sayılır bir hız kazanır.

Disk için ısrar olmadan veri paylaşımı

Mümkün, çoğu durumda, her iki etkinlik aynı işlemde çalıştırmak verilen hafızasına kaydederek faaliyetleri arasında veri paylaşımı için.

Not:kullanıcı etkinliği ayrıldığında bazen, (çıkma), Android uygulaması öldürmeye karar verebilir. Bu senaryoda, en son etkinliği niyet uygulamayı daha önce sağlanan kullanarak başlatmak için android çalışır öldürüldü durumlar yaşadım. Bu durumda, veri singleton içinde saklı (ya seninkini ya Application) gitmiş olacak ve kötü şeyler olabilir. Bu gibi durumlarda önlemek için, ya da geçerli olduğundan emin olmak için kullanmadan önce disk veya kontrol veri nesneleri kalıcı.

Tek bir sınıfı kullanın

Tüm veri için bir sınıf var:

public class DataHolder {
  private String data;
  public String getData() {return data;}
  public void setData(String data) {this.data = data;}

  private static final DataHolder holder = new DataHolder();
  public static DataHolder getInstance() {return holder;}
}

Başlatılan etkinlik: gelen

String data = DataHolder.getInstance().getData();

Uygulama tek kullanın

Uygulama tek uygulama başlatıldığında oluşturulan android.app.Application bir örneğidir. Application uzanan özel bir tek sağlayabilir:

import android.app.Application;
public class MyApplication extends Application {
  private String data;
  public String getData() {return data;}
  public void setData(String data) {this.data = data;}
}

Önce bu etkinliği başlatan:

MyApplication app = (MyApplication) getApplicationContext();
app.setData(someData);

Daha sonra başlatılan etkinlik:

MyApplication app = (MyApplication) getApplicationContext();
String data = app.getData();

Statik alanlar

Fikir singleton daha temelde olduğunu, ancak bu durumda veri statik erişim sağlar:

public class DataHolder {
  private static String data;
  public static String getData() {return data;}
  public static String setData(String data) {this.data = data;}
}

Başlatılan etkinlik: gelen

String data = DataHolder.getData();

WeakReferences HashMap

Aynı fikir, ama çöp toplayıcı için izin başvurulmayan nesneleri kaldırıldı (kullanıcı etkinliği sonlandırılıyor gibi):

public class DataHolder {
  Map<String, WeakReference<Object>> data = new HashMap<String, WeakReference<Object>>();

  void save(String id, Object object) {
    data.put(id, new WeakReference<Object>(object));
  }

  Object retrieve(String id) {
    WeakReference<Object> objectWeakReference = data.get(id);
    return objectWeakReference.get();
  }
}

Önce bu etkinliği başlatan:

DataHolder.getInstance().save(someId, someObject);

Başlatılan etkinlik: gelen

DataHolder.getInstance().retrieve(someId);

Olabilir veya bir nesne kimliği niyet var ekstralar kullanarak geçmek zorunda olmayabilir. O belirli bir soruna bağlıdır.

Disk nesneleri kalıcı

Amaç diğer etkinliği başlatmadan önce disk verileri kurtarmak için.

Avantajları:diğer yerlerden aktivite başlatabilirsiniz ve, eğer veriler zaten kalıcıdır, sadece iyi çalışması gerekir.

Dezavantajları:o hantal ve uygulamak için daha fazla zaman alır. Gerektirir tanıtan hataların daha fazla kod ve böylece daha fazla şans. Ayrıca çok daha yavaş olacaktır.

Nesneler vardır kalıcı olması için bazı yollar:

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • H3Ctic (old channel)

    H3Ctic (old

    23 Mart 2011
  • Phymec

    Phymec

    18 Temmuz 2009
  • wafflepwn

    wafflepwn

    14 AĞUSTOS 2008