Yorliqlar o'rtasida ob'ektni almashish (turli harakatlar)

Men muammoning eng yaxshi yechimini topishga harakat qilaman: 3 ta yorliqli ilovani ishlab chiqyapman. Men dam olish xizmatidan xml ma'lumotlarini olaman va uni ob'ektga ajrataman (faqat bitta so'rov mavjud). 3 ta yorliq endi ushbu ma'lumotlarning turli qismlarini ko'rsatadi. Kodni o'qilishi mumkin bo'lishi uchun dasturni turli xil harakatlarga bo'lish haqida o'ylardim. Faoliyatlar o'rtasida sanani qanday baham ko'raman? Bilaman, bu savol million marta qo'yilgan, lekin men hali ham yechim topa olmayapman.

  1. ilova obyekti kerak Ilova sinfidan olish uchun, lekin mening asosiy faoliyatim allaqachon TabActivity sinfidan olingan. boshqa asosiy sinfdan foydalaning va keyin mening tab sinfimni niyat bilan boshlaysizmi?

  2. Ob'yektlarga zaif havolalar xashxaritasi. Xotirani behuda sarflayotgandek tuyuladi, lekin bu mumkin.

  3. Barcha kodni bitta faoliyatga qo'ying va u bilan yakunlang.

Har qanday yordam uchun rahmat :)


person Redfox    schedule 14.11.2011    source manba
comment
Javobni o'zingizga tegishli bo'lsa ham tanlashingiz kerak!   -  person AsTeR    schedule 15.11.2011
comment
Javobimni tanlashim uchun vaqt tugashini kutyapman. Sizning kodingizdan foydalanib, singleton turi noma'lum degan xatoga yo'l qo'yaman. Eclipse ushbu sinf uchun importni topa olmadi. Lekin baribir harakatingiz uchun rahmat. (iltimos, to'plashni to'xtating [tinish belgilaridan oldin keraksiz oq bo'shliqlardan foydalanish]) Men buni qanday kodlashni bilmayman degan fikrni oldim. Afsuski, men sizning taklifingizni tushuna olmadim.   -  person Redfox    schedule 16.11.2011
comment
Agar qayta urinib ko'rmoqchi bo'lsangiz, uzr, nusxa ko'chirishdan keyin ba'zi so'zlarni almashtirishni unutib qo'ydim. Men hali ham bu yondashuvni eng yaxshi deb o'ylayman.   -  person AsTeR    schedule 17.11.2011


Javoblar (5)


Ideal yechim shundan iboratki, faoliyat qolgan so'rovni ishga tushiradigan va boshqaradigan xizmatni xabardor qiladi, natijani sqlite-db kabi joyda saqlaydi, so'ngra xizmat ma'lumotlarni so'rashi uchun tranzaktsiya amalga oshirilganligi haqida xabar beradi.

Lekin sizda faqat bitta iltimos bor va yuqorida aytilganlarning barchasini bajarish bilan bezovtalanmaysiz deb o'ylamayman, shuning uchun men 3-raqamga boraman.

person josephus    schedule 14.11.2011
comment
ha, men 3-raqamga moyilman;) - person Redfox; 14.11.2011
comment
Turli xil harakatlar har bir fayl uchun kamroq kodga olib keladi. Lekin men bir faoliyatda hammasi yaxshi yoki yo'qligini bilib olaman. - person Redfox; 14.11.2011
comment
Noto'g'ri narsa shundaki, kodni yanada aniqroq qilish uchun ajratish yaxshi narsa. Buni qilmaslik iflos va dangasa;) - person AsTeR; 14.11.2011

Maʼlumotlar:

import android.app.Application;
public class Data extends Application {

private int blupp = 0;

public void setBlupp(final int bla) {
    blupp = bla;
}

public int getBlupp() {
    return blupp;
}
}

Bitta faoliyatning oncreate() usulida ma'lumotlarni o'rnatish:

final Data myData = ((Data) getApplicationContext());
myData.setBlupp(12);

Uni boshqasining oncreate() usulida olish:

final Data myData = ((Data) getApplicationContext());
final int test = myData.getBlupp();

Android manifestida:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:name="Data">

Sinf ma'lumotlari u erda joylashtirilishi kerak. Bu juda oddiy edi. Bu forumda formatlash biroz chalkash. Men buni kod formati bilan to'liq tushunmayapman. :( Barcha yordam uchun rahmat.

person Redfox    schedule 15.11.2011

Barcha ilovalarimda men Kontekst sinfidan foydalanmoqdaman (Singleton orqali chaqiriladi. a>) turli faoliyatlar orqali baham ko'rish uchun har qanday sababga ega bo'lgan ilova darajasidagi barcha ma'lumotlar va ma'lumotlarni saqlaydigan.

Aytgancha, bu model darajasini joriy qiladi (MVC da uning ma'nosi) ilovangizda, dasturiy ta'minotni loyihalashda ushbu qism foydalanuvchi ma'lumotlarini va ilova holatini aks ettiruvchi ma'lumotlarni saqlash uchun ishlatilishi kerak.

Singleton misoli:

public class AppContext {

    public String username = null;

    //////////////////
    // below the singleton implementation
    //////////////////

    private static final AppContext instance = new AppContext();

    // Private constructor prevents instantiation from other classes
    private AppContext() { }

    public static AppContext getInstance() {
        return instance;
    }
}

Maʼlumotlaringizni internetdan olganingizda (bu yerda foydalanuvchi nomi):

AppContext.getInstance().username = receivedUsername;

Uni faoliyatingizdan birida olish uchun:

myLabel.setText(AppContext.getInstance().username);

PS1: bunday maqsadni qondirish uchun arizani kengaytirish men uchun yaxshi narsa emasdek tuyuladi. Ilova sinfini kengaytirish odatiy dastur xatti-harakatlarini kengaytirishi kerak, bu umumiy ma'lumotlarni saqlash vositasi emas.

PS2: ma'lumotlaringizni tuzilish uchun kontekst ob'ektiga zaif mos yozuvlar xaritangiz qo'shilishi mumkin

person AsTeR    schedule 14.11.2011
comment
Singleton ilova ob'ektidan foydalanadimi? - person Redfox; 14.11.2011
comment
Ilovangizning hamma joyidan foydalanish mumkin bo'lishi uchun yozilgan yagona sinf yo'q. O'ylaymanki, dastur ob'ektiga teginish sizning muammoingiz uchun yomon fikrdir - person AsTeR; 14.11.2011
comment
Agar java'da Singletonni qanday qilishni bilmasangiz, vikipediya sahifasini tekshiring. - person AsTeR; 14.11.2011
comment
Men singelton g'oyasini bilaman, lekin uni androidda ishlatishning to'g'ri yo'lini bilmayman. Ilova sinfidan foydalanish umumiy ma'lumotlarni saqlash vositasi bo'lmaslik kerak, keyin nima? :) - person Redfox; 14.11.2011
comment
Singletondan foydalanishning to'g'ri usuli faqat uning atributlarini qo'shishdir (bu asosiy ma'lumotlar ob'ekti). Masalan, agar siz dam olish xizmatidan foydalanuvchi nomini olsangiz, shunchaki: AppContext.getInstance().username = acceptUsername; uni boshqa joydan olish uchun AppContext.getInstance().username Bu yetarlicha tushunarlimi? -› Men javobimni kod bilan yangiladim - person AsTeR; 14.11.2011
comment
Bizning harakatlarimiz uchun sizga katta rahmat. Bu yondashuvni sinab ko'rishim bilanoq uni sinab ko'raman: stackoverflow.com/questions/708012/ - person Redfox; 14.11.2011
comment
Ha, yo'q, tushundim. Qat'iyatingiz uchun rahmat. Shu tarzda men barcha getter va setter usullarini tashlab qo'yishim mumkin. Bu, albatta, eng yaxshi yondashuv. Yana bir bor rahmat - person Redfox; 18.11.2011
comment
Ammo bu yondashuvni hech qanday qabul qiluvchi va sozlagichsiz ishlatish o'zgaruvchilar ommaviy bo'lishi kerak, bu juda xunuk. :( - person Redfox; 18.11.2011
comment
Bu siz uni qanday ishlatishni rejalashtirganingizga bog'liq. Men hamma joyda getter va setterni qo'yish haqidagi yondashuvdan voz kechaman. Eclipse Java, biror joyga biror narsani ulash kerak bo'lganda juda oson refactoring yechimini taklif qiladi, bu holda Kontekst klassi ilovangiz ichidagi ma'lumotlarni almashish uchun oddiy vositadir, ba'zi ehtiyojlar uchun siz unga usul qo'yishingiz yoki boshqa mulkka kirish siyosatini loyihalashingiz mumkin. - person AsTeR; 18.11.2011

bilan ob'ekt yaratishga harakat qiling

umumiy statik ob'ekt....

bu statik ob'ekt barcha sinflaringiz uchun ishlatilishi mumkin, siz ob'ektga ClassName.objectName bilan xayrlashishingiz mumkin

person Maulik J    schedule 14.11.2011

Ma'lumotlarga qarab, buni amalga oshirishning bir qancha usullari mavjud. Ma'lumotlar qanchalik katta? Agar u faqat matnli bo'lsa va unchalik katta bo'lmasa, uni butun dastur davomida xotirada saqlash muammo bo'lmasligi mumkin.

Agar arizangizni turli faoliyatlarga ajratsangiz, sizda ikkita tanlov mavjud:

  • Ma'lumotlarni harakatlar o'rtasida maqsadli qo'shimchalar sifatida uzatish. Aytaylik, sukut bo'yicha ko'rsatilgan faoliyat ma'lumotlarni oladi. Maʼlumotlarning boshqa qismlarini koʻrmoqchi boʻlganingizda, kerakli maʼlumotlarni maqsadingizga toʻplashingiz va ularni getIntent().getExtras() yordamida yangi yaratilgan faoliyatingizda olishingiz mumkin.
  • Ma'lumotni singletonda yoki Ilova kichik sinfining misol o'zgaruvchisi sifatida saqlash. Singletondan foydalanmaslikni maslahat beraman, chunki boshqa ob'ektlarga havolalarsiz o'z-o'zidan yashovchi ob'ektlar sizning kodingizni xotira oqishiga ko'proq moyil qiladi. Ilova sinfingizda ma'lumotlarni saqlash menimcha yaxshiroq yondashuv.

Aytganimizdek, to'g'ri yechim sizning ma'lumotlaringiz qanday ko'rinishiga bog'liq. Agar sizning barcha harakatlaringiz ma'lumotlarning turli qismlarini ko'rsatsa, men uni Ilova kichik sinfimda saqlagan bo'lardim. Ammo, agar sizning arizangiz kontaktlar roʻyxatiga oʻxshash tarzda tuzilgan boʻlsa (kontaktlarni koʻrsatish uchun bitta harakat va kontakt haqida batafsil maʼlumot olish uchun bitta harakat), ehtimol men oʻz maʼlumotlarimni asosiy faoliyatda boʻlardim va faqat kerakli maʼlumotlarni uzataman. boshqa faoliyatimga.

person Bendik    schedule 14.11.2011
comment
Javobingiz uchun rahmat. Bu ko'p aloqalar ro'yxati. Bir nechta qiymatlar va har birida 3-4 ta yozuvdan iborat oʻnlab qatorlardan iborat ikkita roʻyxatli shaxsiy yorliq. Lekin niyat bilan aroung tahlil qilish uchun ko'p qadriyatlar, imho. Men TabActivity kichik klassini ishga tushiradigan Ilova quyi sinfini yaratishga harakat qilaman. - person Redfox; 14.11.2011