Hirdetés

2024. április 25., csütörtök

Gyorskeresés

Hozzászólások

(#2001) thon73


thon73
tag

Sziasztok!

Egy érdekes problémával küszködök. AsyncTaskLoader-t készítettem, ami működik is. DE! A háttérben álló adatok az Activity-n keresztül változtathatóak meg, tehát az AsyncTaskLoader-nek valahogy az Activity-t kellene figyelnie, hogy mikor következik be változás.
A gond akkor kezdődik, amikor elfordítom a készüléket, uis. ilyenkor egy új Activity keletkezik (és ettől a ponttól már ezt kellene figyelni, és a régit elengedni), ugyanakkor (ha jól értem a működést) az AsyncTaskLoader túlél, legfeljebb újraindul.
Hogyan illik ezt elegánsan megcsinálni?
Egy leegyszerűsített példában csak egy gombnyomással akarom szimulálni az adatváltozást. Az Observer az AsyncTaskLoader lenne, az Observable pedig az Activity (vagy a Button, de az előbbi egyszerűbb). Na de akkor hogyan tudná az Observable oldal magát kikapcsolni, meg aztán az új Activity-t visszakapcsolni? :F
Meg tudja ezt valaki mondani? Vagy valami más ötlet esetleg?

(#2002) thon73 válasza thon73 (#2001) üzenetére


thon73
tag

Ilyen nehezet kérdeztem, vagy mindenki békésen szunnyad az ebéd(ek) után? :))

Saját fejem törésével erre jutottam: Van itten egy olyan, hogy a LoaderManager-től le tudom kérdezni az aktív Loader-eket. Az Activity induláskor megnézi, hogy van-e Loader, s ha igen, akkor beregisztrálja magát (Uis. ilyenkor valaki már létrehozta a Loadert, pontosabban az előző megvalósulásunk hozta létre.) Záráskor szintúgy megnézi, csak éppen kiregisztrálja magát, - kiregisztrálTATja magát a megtalált Loader-rel az obszerválandók közül. Néha elgondolkodom, hogy télleg az Android Way a legegyenesebb-e?? :F

Ha valaki látott már egyszerűbbet, akkor ne habozzon elmesélni...

Teljesen más: Tudja valaki mi az a Samsung File-Stor Gadget? A nem létező UMS kapcsolatom SGSII 4.1.2 alatt ezzel mégis létezik. Ha tudnám, mi ez, rátenném a tabletre is... A szívemhez közel áll a Mass-Storage gyorsasága, és a proxy szerver sem zavarja...

[ Szerkesztve ]

(#2003) Karma válasza thon73 (#2002) üzenetére


Karma
félisten

Nekem személy szerint a loaderek csak a TODO listámon vannak, nem tanultam ki őket még. De azon filóztm, hogy miért nem használod ki a broadcastokat arra, hogy jelzéseket szórjanak adatváltozáskor, amire a Loader példány feliratkozik, és onContentChangedet hív magán?

“All nothings are not equal.”

(#2004) h1ght3chzor


h1ght3chzor
őstag

Sziasztok!

Van egy List<XX> list-em, amiben így tárolom a dolgokat: "A: " + this.a+ "; B: " + this.b+ "...

Bluetooth-on keresztül kellene ezt átküldenem, hogyan érdemes belőle JSON-t csinálni?

Köszönöm!
Üdv

[ Szerkesztve ]

Kérlek tisztelj meg azzal, hogy válaszolsz a privát üzenetre.

(#2005) Karma válasza h1ght3chzor (#2004) üzenetére


Karma
félisten

Most akkor XX az valami osztály, vagy String? Az előbbi tagmondat erre, a thises történet amarra utal.

Ha osztályok, akkor használd a Gson nevű lubet, gyorsan érhetsz el vele jó eredményeket. Csak a listára kell hívnod egy Gson.toJson-t.

Ha stringek, igazából akkor is ugyanez, de nem ártana kicsit elgondolkodni az adatmodellen.

“All nothings are not equal.”

(#2006) h1ght3chzor válasza Karma (#2005) üzenetére


h1ght3chzor
őstag

XX egy osztály, aminek van egy metódusa, hogy toString, és az csinálja azt a formátumot.

Kérlek tisztelj meg azzal, hogy válaszolsz a privát üzenetre.

(#2007) Karma válasza h1ght3chzor (#2006) üzenetére


Karma
félisten

Akkor az a JSON szempontjából igencsak irreleváns. Ha nem akarod parsolni ebben a programban, akkor akár magad is írhatsz egy toJSON metódust: majdnem ugyanolyan mint a toStringed, csak kapcsoszárójel van körülötte, a mezőnevek idézőjelben vannak, és vessző az elválasztó.

“All nothings are not equal.”

(#2008) thon73 válasza Karma (#2003) üzenetére


thon73
tag

A broadcast-okkal megy is szépen, a példaprogramokban is broadcast-ok szerepelnek, csak éppen a rendszer által indítottak.
Lehet, hogy nekem is broadcastolni kellene az activity-ben, ha valami változik? Hm. Ez egy megfontolandó ötlet, köszi.

Amúgy a Loader-ekkel én is csak ismerkedés szintjén "játszom". Van egy file-ban tárolt adathalmaz, aminek a beolvasása kb. 4-5 sec. Ezt akartam beletenni Loader-be. Ez - a felhasználó oldaláról - statikus adathalmaz, tehát nincs mit figyelni. Az én (tesztelő) oldalamról van lehetőség a változtatásra, de akkor újramenti a teljes megváltoztatott adatbázist (mert módosításkor az összefüggő adatok miatt a nagyrésze megváltozik). Ettől függetlenül arra voltam kíváncsi, hogy ha én változtatok a külső adatokon az Activity-ben (bocsánat -ból), akkor hogyan értesülhet erről a Loader.
A fenti (mostmár két) megoldáson kívül még egy érdekes osztályt találtam: a FileObserver-t. De az még bonyolultabbnak tűnt.

Ami még gondnak tűnik nekem: végső soron a Loader-rel is be kell olvasnom mindent, ahhoz, hogy a lista eleje megjelenjen. Ez amúgy logikus (mert nem biztos, hogy a lista eleje töltődik be először), de a várakozási idő ugyanúgy megvan (csak pörög az óra...)

(#2009) thon73 válasza thon73 (#2008) üzenetére


thon73
tag

Egy apró kiegészítés: megcsináltam broadcsat publish-sel. Ez tényleg pofonegyszerű, öszesen 3 sor. Ez a legjobb!

(#2010) eastsider


eastsider
nagyúr

Sziasztok!

szenvedek még mindig a ContentProviderrel, és a loadermanagerrel

így néz ki a logcatom:
04-06 18:06:49.994: I/Contentxprovider(3652): onCreate
04-06 18:06:50.114: I/MAIN(3652): onCreate
04-06 18:06:50.144: V/TabsPagerAdapter(3652): clicked
04-06 18:06:50.174: I/FilmFragment(3652): onAttach
04-06 18:06:50.204: I/FilmFragment(3652): Loader<Cursor>
04-06 18:06:50.204: I/FilmFragment(3652): Loader<Cursor>
04-06 18:06:50.204: I/FilmFragment(3652): onActivityCreated

és ennyi... simán kilép, ki se írja az FC-t semmi...

van a contentproviderbe 2 tábla, ami joinolva van egymáshoz....
ez egy listfragment, és úgy terveztem, hogy a joinolt táblát egy másik listfragmenten jelenítem meg
szóval a OnListItemClick-re behozza a joinolt táblát, ami az adott item alá tartozik
lehet rosszul gondoltam, és ide más megoldás kell? ha igen,mi?

[ Szerkesztve ]

(#2011) Karma válasza eastsider (#2010) üzenetére


Karma
félisten

Breakpointot próbáltál már rakni az onActivityCreated metódusba, hogy lásd pontosan melyik sor robban?

Az "adott elem alá tartozó joinolt tábla" szerintem nem elég egzakt megfogalmazás... Legalábbis számomra nem egyértelmű, az biztos. Két táblát összejoinolsz, és WHERE feltétellel szűröd az elem kulcsa alapján?

“All nothings are not equal.”

(#2012) eastsider válasza Karma (#2011) üzenetére


eastsider
nagyúr

közbe meglett a hiba. csak a nexus 7 2013 amin tesztelek nem dobott semmi exceptiont... a hiba az volt, hogy nem jó sorrendben volt a checkColumns metódus.... mostmár megy...
azt találtam ki, hogy a listview-n setOnItemClickListener-t állíok, és ekkor, ha egy elemre kattintok, akkor betöltse a hozzá tartozó elemeket ami egy másik táblából jön.
és mivel tabos az alkalmazásom onActivityCreatednél a másik tab kilistázza az összes lehetséges elemet, ami a másik táblák alatt van.. nem tudom jól megfogalmazni :)
szóval van egy filmek tábla, és van egy képek tábla, egy filmben van több kép, egy kép egy filmhez tarozik, de több kép tartozik egy filmhez

(#2013) thon73 válasza eastsider (#2012) üzenetére


thon73
tag

Én ezt egy cseppet átgondolnám.

Csak a saját elgondolásomat tudom közreadni. A tekercs/kép párosnál nekem az író/könyv jobban kézreáll, de ez tetszőlegesen behelyettesíthető...
Tehát:
Van az ÍRÓK tábla (vagy TEKERCS), ami nem hivatkozik senkire.
Van a KÖNYVEK tábla (vagy KÉPEK), ami hivatkozik EGYETLEN ÍRÓRA (vagy EGYETLEN TEKERCSRE)

Ha ez utóbbit listában akarod megjeleníteni, akkor JOIN táblát érdemes használni, hogy lásd a könyv íróját vagy a kép tekercsét is egyúttal. Technikailag javaslom, hogy kiválasztásnál mindig egy új, részleteket mutató Fragmentet hozz létre. Ezt a Backstackra rakhatod, és akkor könnyű visszaugrani a listához. Egy másik elem kiválasztása nem ennek a Fragment-példánynak a mezőit változtatja, hanem létrehoz egy újat.
((Nehéz lesz megoldani egyébként az ÍRÓ (TEKERCS) kiválasztását innen - de nem lehetelen, csak dolgozni kell vele.)) A másik buktató a fragmentek egymás melletti/feletti megjelenítése, de az sem lehetetlen.

Amikor viszont az ÍRÓK/TEKERCSEK listában vagy, akkor lehet, hogy szeretnéd megnézni, hogy mely könyveket írta/képeket tartalmazza. Na, ebben az esetben kell a KÖNYVEK/KÉPEK listát úgy megjeleníteni, hogy szűkítjük a listát a megfelelő íróra/tekercsre.

Hozzáteszem, hogy úgy tapasztaltam, majdnem minden megoldható az sqlite szintjén is, vagy a program szintjén is. Ha univerzáslis megoldásra van szükség, akkor szerintem az sqlite kihasználása gyorsabb, áttekinthetőbb, biztonságosabb; míg speciális esetekben (pl. statikus adathalmaz, speciális - ékezetes - keresések) érdemes/szükséges kódot írni, ami néha!! gyorsabb lehet.

Amúgy én pont ezen küzdöttem végig magam, nem minden pontja volt egyszerű, hibátlan és magától értetődő, de már egész jól működik. Szívesen segítek.

(#2014) eastsider válasza thon73 (#2013) üzenetére


eastsider
nagyúr

köszi!
értem mire gondolsz! szerintem így fogom csinálni, mert pont ezen gondolkoztam, hogy fogom megcsinálni a több féle listázást, néztem a metódusokat, de arra jutottam, hogy sehogy (csak simán átgondolva jutottam erre...), nyilván megoldható, csak szívás ahogy írtad. már össze is állt nagyjából a fejemben hogy fogom véghez vinni ezt.

illetve mivan akkor, ha rámegyek egy íróra, átugrik a másik fragmentre, akkor ugye a hozzá tartozó (ID-jű) rekordokat hozná be, de mivan akkor, ha az még üres? akkor úgy lenne a jó ha alapból felhozná a dialogot, és az adott Foreign Keyjel létrehozhatna egy képet. bár ez szerintem simán megoldható egy getcount()-al...

illetve szerintem itt megpusztult a tabos elképzelésem, jól értem? mert így már 3 fragment kellene, az meg fura lenne így, vagyis nem lenne funkcionális

[ Szerkesztve ]

(#2015) thon73 válasza eastsider (#2014) üzenetére


thon73
tag

A tabos elképzelés ott halt meg, hogy valójában ezek a listák egymásba lesznek öltve. Vegyünk egy idióta példát:
beírsz egy könyvet: Egri Csillagok
kiválasztod az írót: Gárdonyi Géza
de közben megnézed a többi könyvét: szűkített lista, benne Tüskevár
Jé, ezt nem is ő írta, kiválasztod az írót: Írók listája
Jé, nincs benne Fekete István
Író hozzáadása: Fekete István...
És így tovább a végtelenségig.

Én csináltam egy ListFragmentet, és egy EditFragmentet. Most jön a következő probléma: ezek a különböző táblák esetében 90%-ban egyformák lesznek. Tehát csináltam egy General... Fragment-szettet, és ebből származtattam le az egyes tábláknak megfelelő tényleges Fragmenteket.
Akkor jött a következő probléma: ezek a spéci, egymásra hivatkozó mezők igazából új változótípusnak felelnek meg, ezért alkottam belőlük új változókat.
Hopp: és a végeredmény egy felxibilis rendszer, akárhány táblával, könnyen változtatható felépítéssel... viszont egy igen kövér, és sokrétű kóddal. És a legnagyobb vicc, hogy engem tulképp csak az export/import funkcionalitás érdekelt :)

Az a baj, hogy az sqlite nagyon jó. Az android nagyon jó. A kettőt összekötő híd viszont kompletten hiányzik. Mármint a UserInterface oldala, mert amúgy a program adatainak tárolására elég könnyen használható.

De ez csak a magánvéleményem.
És azért teszem itt közzé, mert a fentebb közzétett programhoz tartozik.

(#2016) eastsider válasza thon73 (#2015) üzenetére


eastsider
nagyúr

nem egészen így lesz a programom
inkább úgy, hogy van egy író, aminek több könyve van, de egy könyvet csak egy ír
szóval rámegyek, hogy Gárdonyi Géza, és kijön az egri csillagok, meg az összes könyve Gárdonyinak, szóval pont fordítva írtad, ahogy én elképzeltem :)

azt tervesztem,

A eset:
hogy alapból az lenne, hogy alapból van ugye két tab, egyiken az összes író, ha átlapozok a másikra az behúzza az összes íróhoz tartozó összes könyvet, ugyanis lehet valaki csak a könyvek között szeretne böngészni, mert pl nem tudjam ki írta, csak a címét.. (nem túl életszerű példa, de a programomnál nagyon is)

B eset:
rákattintok egy íróra és behúzza a az ahhoz az íróhoz tartozó könyveket (amiket ő írt). vagyis a JOINolt mezőket.

utánanéztem kicsit, és lehet futásidőben cserélgetni a tabok tartalmát, úgy hogy a felhasználó ne vegye észre, csak a tartalom változzon (a fragment, de tabokon ne látszódjon semmi)
[link]
[link]

más: foglalkoztál már kamerával készített kép SQLiteban való letárolásával (és lekérdezésével)?
szerintme BLOB helyett az útvonalat fogom letárolni (ahogy néztem ennek egyszerűbbnek kell lennie, meg hasznosabb is, minden fotós alkalmazás ezt használja). persze itt kezelni kell, ha kitörli a júzer a képet, de szerintem ez nem vészes

[ Szerkesztve ]

(#2017) thon73 válasza eastsider (#2016) üzenetére


thon73
tag

Na, igen. Ez pont így működik, ha fel van töltve az adatbázis. De hogy töltöd fel? Először uis. üres.
A képeket ugyanígy oldottam (volna) meg, jelenleg csak a hivatkozásoknál tartok - vagyis bármilyen file-t tudok tárolni, akár képet is.
((Mondjuk én lehet, h. tárolnék egy másolatot a képről, vagy egy thumbnail-t; külön helyen))

(#2018) eastsider válasza thon73 (#2017) üzenetére


eastsider
nagyúr

Egyébként lehet vizsgálni kellene hogy ha nem tartozik adott IDhez semmi akkor egyből felhozni a dialogot és oda bedobni az ID t. Vagy valamit trukkozni amikor létre hozom az adott írót (persze az nem túl szép)
Hogy lehet ezt egyáltalán megoldani?

[ Szerkesztve ]

(#2019) thon73 válasza eastsider (#2018) üzenetére


thon73
tag

Bocs, de valahol teljesen elvesztettem a fonalat... Hogyhogy nem tartozik adat egy id-hez, amit viszont ismersz?

Szerintem (de nyugodtan szóljon bele adatbázis-tudós is):
Van a könyvek/képek tábla (ami kezdetben üres), és van az írók/tekercsek tábla, ami szintén üres.
Azt kell megoldanod, hogy fel tudj vinni egy KÉPET, ami hivatkozik egy tekercsre. Mivel ezt nem az _id alapján, hanem listából választod ki, nem tudsz "üres" _id-t hozzárendelni (az ugyanis meg sem jelenik a listában); legfeljebb azt tudod jelezni, hogy NINCS hozzárendelve tekercs (már ha ez megengedett)
És persze kell egy "űrlap", ahol a tekercseket viszed fel.

Én a helyedben először gyártanék egy felületet csak a képek táblához. Aztán ugyanezt kibővíteném egy független tekercsek táblával. Amikor ez kész, akkor megpróbálnám kiegészíteni azzal, hogy a képek listájában megjelennek a tekercsek, ill. a képek űrlapján is ki lehessen választani egy tekercset. Közben adni fogja magát, hogy miként kényelmes elrendezni, listákkal, tabokkal, fragmentekkel...

Mindenkitől bocs, hogy ennyit dumálok, de pont ugyanezen vergődtem végig, és pontosan tudom, hogy nem egyszerű. Mindenesetre fentebb már megosztottam a kódot, ahol én tartok; szerintem azért is érdemes kipróbálni (mármint a kész programot használni), mert gyorsan kiderül, hogy hol vannak azok a részek, ahol megbicsaklik az egész felület. Eredetileg én sem gondoltam egy csomó mindenre, ez csak a fejlesztés során fog kiderülni...

(#2020) eastsider válasza thon73 (#2019) üzenetére


eastsider
nagyúr

lehet nem jól fogalmaztam. telórol írtam..

szóval Te azt mondod, hogy először úgy csináljam meg, hogy egy listFragment, amin csak a képek tábla jelenik meg. szóvel úgymond "független" a másiktól (nem az adatbázisra gondolok).
és itt cisnálok egy dialogot, amin kiválasztom, melyik tekercshez tartozzon a felvivendő kép?
és így már listázni simán tudnám a JOIN-nal. így értetted nem?
a függelten tekercs táblát nem értem, azt hogy érted?

azt kellene megoldani, hogy rákatt a tekercsre, átdob a hozzá tartozó képeket tartozó listára.
ekkor, mivel nincs kép, de megvan a tekercs ID-je, létre tudom hozni a képeket, mert megvan az ID, nem jól gondolom? mármint a film ID-je megvan, innentől nincs sok gond, vagy rosszul értem?

az összes kép kilistázását későbbre hagynám

nem hiszem, hogy felesleges lenne, ha valaki rákeres erre a topikban, legalább fog valamit találni :)

[ Szerkesztve ]

(#2021) thon73 válasza eastsider (#2020) üzenetére


thon73
tag

Aha. Két malomban őrlünk. Háromban.

Tehát: a program elkészítésének a folyamatára értem, hogy először egy vagy két, de független táblával próbálkozz, az is elég izgalmat ad. Csak ha ez már jól működik, akkor próbáld beletenni a join-t táblát. Egyszerre kivitelezni az egészet annyi hibalehetőséget ad az első próbáig, hogy nagyon nehéz kilábalni belőle. Szerintem jobb, ha egy egyszerűbb része biztonságosan működik, és utána lépsz tovább.

A végső elrendezéshez:
Két megközelítés létezik (sztem.): én egyesével viszem be az adatokat. Vagyis: EGY kép/könyv/adat felvételekor választom ki hozzá a megfelelő kapcsolt adatot (tekercs/író stb.)
Te sztem. KÖTEGELT felvitelt szeretnél: kiválasztod a tekercset, aztán hozzárendelsz - gondolom egy hatalmas poolból - egy csomó képet. Ez is járható út.

A lényeg nem változik:
Egyszerre egy rekordot tudsz létrehozni. Annak a mezőit kell kitöltened. A TEKERCSEK mező értékét kiválaszthatod a létrehozáskor (egyszeres módszer), vagy már tudod előre, és ezt az ismert tekercs _id-t teszed az összes létrehozandó rekordba (kötegelt mód).

Mind a két módszernek megvan a létjogosultsága. Pl. van 3000 képem, kijelölök 250-t, és egyszerre (kötegben) hozzárendelem egy tekercshez. Ennek ellenére nem fogod tudni megkerülni az egyszeres módszert sem, két okból: 1. a képek más adatokat is tartalmaznak ISO, hely stb. Ezt honnan veszik? Minden tekercsen egyforma? Akkor uis a tekercs táblába tartozik. EXIF adatot importál? Az egy külön funkció, és kézzel is meg kell tudnod változtatni. 2. mi van, ha egy képet rossz helyre raktál?

Sztem. is hasznos, sőt a legfontosabb egy program felépítését megbeszélni; kételyem csak abban van, hogy mennyire érdekes ez másoknak, akik itt esetleg rövid android praktikákat akarnak megtudni. De éppen át is vonulhatunk valami semleges területre, ha untatjuk az itt olvasókat. Én speciel hasznosnak tartanám, ha nálamnál tapasztaltabbak is hozzátennék a tudásukat; azt azért átérzem, hogy ez a projekt mennyire fontos neked.

Amúgy én azt tenném, hogy egyszerűen, magyarul és képekkel leírnám, hogy mit is akarok, hogy tegyen a program, végiglogikáznám, aztán ahhoz alkotnám meg a hátteret.

(#2022) eastsider válasza thon73 (#2021) üzenetére


eastsider
nagyúr

most ment PÜ inkább, nem lenne OFF, de szerintem jobb ott

[ Szerkesztve ]

(#2023) Sianis


Sianis
addikt

ButterKnife háza táján érdekes mozgolódás. [link]

Sianis

(#2024) h1ght3chzor


h1ght3chzor
őstag

Az alábbi sorokból van x db enterrel elválasztva, hogyan tudok JSON Objektumot csinálni belőlük?

Subject: VMI; StartDateTime: 11/08/2011 09:00:00 AM;12/13/2011 09:00:00 AM; EndDateTime: 11/08/2011 10:00:00 AM;12/13/2011 10:00:00 AM; Chair: LastName Firstname; Room: null

[ Szerkesztve ]

Kérlek tisztelj meg azzal, hogy válaszolsz a privát üzenetre.

(#2025) tboy93


tboy93
nagyúr

Sziasztok!

Van egy feladat amit meg kell oldanom, de nem találom rá a megfelelő megoldást.

Röviden: Android készülékekről van szó, de a kérdés inkább JAVA-s. A feladat a következő. Van egy szerver tablet, ami irányít 30-50 kliens tabletet. A szervernek parancsokat (pl. videó indítása) kell küldenie a klienseknek, és ezeknek a parancsoknak egyszerre kell megérkezniük a tabletekre, ez nagyon fontos! Illetve visszafele is kell működjön az adatküldés, némely esetben a kliensek is küldenek a szervernek adatokat (statisztika).

Szóval egy ilyen hálózatot kell felépítenem. Bevallom őszintén nem vagyok a toppon hálózat témában. Utánanéztem a TCP illetve UDP kapcsolatoknak. UDP példaprogramot csináltam is, de sajnos csomagvesztés lép fel, nem minden készülék kapja meg az adatokat. A TCP 30-50 tabletnél nem tudom mennyire működhet.

Ti mit gondoltok erről? Hogyan kéne megvalósítani? Előre is köszönöm a tippeket! :R

Üdv
Gergő

(#2026) Sianis válasza tboy93 (#2025) üzenetére


Sianis
addikt

Push notification? Pl: Parse?

Ezzel lehet oda-vissza küldözgetni a parancsokat. Mondjuk a visszafelé kommunikációra talán már érdemesebb lenne TCP/IP kapcsolatot nyitni.

Sianis

(#2027) tboy93 válasza Sianis (#2026) üzenetére


tboy93
nagyúr

Erről még nem hallottam, utánanézek. :R

(#2028) WonderCSabo válasza h1ght3chzor (#2024) üzenetére


WonderCSabo
félisten

Splitteled a : és a ; mentén, végigmész és szépen hozzáadod a JSONObject-hez. Ez utóbbihoz itt van tutorial.

(#2023) Sianis: Én ButterKnife helyett AndroidAnnotationst használok. :)

[ Szerkesztve ]

(#2029) Sianis válasza WonderCSabo (#2028) üzenetére


Sianis
addikt

ButterKnife pehelysúlyúbb. Én is Annotations párti voltam, de mivel ez jóval kevésbé terhes dolog így inkább ezt szoktam már használni. Inkább olvashatóságot ad ez a kódnak, mint keretrendszert.

Sianis

(#2030) WonderCSabo válasza Sianis (#2029) üzenetére


WonderCSabo
félisten

Háát, a ButterKnife azért némi reflectiont használ. Illetve sokkal-de sokkal kevesebbet tud mint az AA. De valóban pehelysúlyúbb.

(#2031) tboy93 válasza Sianis (#2026) üzenetére


tboy93
nagyúr

Ránéztem, de pontosan nem vágom, hogy ezzel hogyan küldhetek egy szerver tabletről adatot 50 kliensre :(

(#2032) Karma válasza tboy93 (#2031) üzenetére


Karma
félisten

Sehogy, mert erre nem alkalmas. Valamilyen lokális megoldásra lesz szükséged... Algoritmikusan elég nehéz lenne biztosítani hogy mindenki ugyanakkor induljon...

Egy huszárvágás jellegű ötletem azért van: az eszközök NTP-vel megszerzik a pontos időt, a szerver meg olyan üzenetet küld ki, hogy "14:35:20-kor indítsátok el a lejátszást".

“All nothings are not equal.”

(#2033) tboy93 válasza Karma (#2032) üzenetére


tboy93
nagyúr

Erre gondoltunk már mi is. Egyetlen bibi, hogy bizonyos esetekben nincs erre idő. A rendszer egy buszon lesz, a busz belép egy zónába ahol azonnal indulnia kell a videóknak, lehet hogy 5 mp-es késés múlva már késő lesz és nem is látják amit kéne.

(#2034) tboy93 válasza tboy93 (#2033) üzenetére


tboy93
nagyúr

(mármint az utasok)

(#2035) Karma válasza tboy93 (#2034) üzenetére


Karma
félisten

Miből gondolod, hogy öt másodperc kéne hozzá? StackOverflown is egyébként ezt az ötletet láttam.

Másrészt van egy ilyen projekt is, hátha hasznos: [link]

“All nothings are not equal.”

(#2036) tboy93 válasza Karma (#2035) üzenetére


tboy93
nagyúr

Köszönöm a segítséget, utánanézek! :R

(#2037) thon73


thon73
tag

Meg tudja valaki mondani, hogy elméletben meddig él az Application példány?

Globális változókat tettem Application szintre, és véletlenül vettem észre, hogy ezek a - hiába indítottam el ezeregy programot - nem szűnnek meg soha. (Mondjuk, újratalapítésig pl.)

Erre lehet számítani, vagy az Application osztály is eltűnik egyszercsak, és újra létrehozásra kerül egy következő indításkor?

(#2038) Karma válasza thon73 (#2037) üzenetére


Karma
félisten

Ameddig a rendszer ki nem lövi, ami nem determinisztikus általában. Ha a task managerrel megölöd, vagy force close-olod az appot, az például ezt eredményezi.

Az activity indítás launcherből nem garantálja viszont, hogy új app is létrejön.

“All nothings are not equal.”

(#2039) thon73 válasza Karma (#2038) üzenetére


thon73
tag

Aha. Pont erre jutottam, hogy az app sokkal ellenállóbb, mint az activity.
Azt hittem pedig, hogy amikor memóriára van szükség, akkor nem csak az Activity-t, hanem a teljes App-ot leállítja. (A kilövés az világos, az FC is logikus, de arra nem gondoltam)

Csakhogy ez újabb gondolatokat is ébreszt bennem: Ha az app megmarad, akkor a teljes process megmarad, nem? Akkor viszont az elindított thread-ek sem fognak megállni? Vagy hogyan van ez? Én azt gondoltam, hogy a BACK-kel (v. pl. finish-sel) való kilépéskor, ill. ha elfogy a hely, akkor ez leáll - de ezek szerint tévedtem.

(#2040) WonderCSabo válasza thon73 (#2039) üzenetére


WonderCSabo
félisten

Így van, a process megmarad, és a threadek is futnak tovább.

(#2041) Sianis


Sianis
addikt

Hogyan készítsük variánsokat Gradle segítségével. [link]

Kipróbáltam, tök jól működik. Egyik projektbe kellett tennem most olyat, hogy más legyen az alap URL az API hívásoknál. És lehet futtatni 2 külön verziót, kódbázis ugyanaz, megférnek együtt egy eszközön, mégis más címre küldenek.

Szóljatok, ha zavaró, hogy az érdekesebb dolgokat így direktbe belököm.

Sianis

(#2042) WonderCSabo válasza Sianis (#2041) üzenetére


WonderCSabo
félisten

Nem zavaró, sőt, nagyon hasznos!

Mondjuk én maven párti vagyok, de ezt már asszem régebben kifejtettem. :)

(#2043) Karma válasza Sianis (#2041) üzenetére


Karma
félisten

Még nem váltottunk Studiora, úgyhogy legutoljára amikor ilyen kellett, a lib project + három manifest+ikon+strings.xml-ből álló app projekt felállást csináltam végig. Ez a flavorosdi nagy erő az új build rendszerben.

És ne hagyd abba a linkelést :)

“All nothings are not equal.”

(#2044) thon73 válasza WonderCSabo (#2040) üzenetére


thon73
tag

Bocs, átmenetileg net-mentes lettem...

Tehát, ha az elindított thread-ek tovább futhatnak, akkor azokat is illik leállítani onPause-ban? Ami meg hosszan kell azt indítsam service-ként? Eddig nem használtam Looper-t (vagy legalábbis nem tudtam róla), ez meg most elbizonytalanított...

(#2045) WonderCSabo válasza thon73 (#2044) üzenetére


WonderCSabo
félisten

Akkor állítsd le onPause-ban, ha szükséges leállítani. Nem baj, ha tovább futnak. Ha hosszú folyamat kell, akkor tényleg érdemes Service-t használni.

A Looper-ekről itt és itt olvashatsz. Nem értem teljesen, hogy miért használnál ehhez Loopert.

(#2046) thon73 válasza WonderCSabo (#2045) üzenetére


thon73
tag

Ja, nem erre használnék Loopert, attól függetlenül tűnt fel. Looperrel egy lineáris file írást akartam kitenni, hogy a számítások meg az írás külön szálon fusson. És csak küldözgetné a háttérszálra, ami kész van és ki kell írni...
Olymódon semmi gond, hogy le tudom állítani, csak nem is gondoltam rá idáig. Ha életben hagyom, akkor nem fog újabb és újabb szálakat indítani minden egyes Activity újraindítás? Vagy nem érdekes, mert eltakarítja, amelyikre nincs élő hivatkozás?

A cikkekért köszönet, megint csak megvilágosodott egy-két dolog. Minél többet ismerek meg az androidból, annál nagyobb a rálátásom a saját tudatlanságomra...

[ Szerkesztve ]

(#2047) eastsider


eastsider
nagyúr

Sziasztok!

valaki nem járatos véletlenül a viewpagerekben, FragmentStatePagerAdapter -ben?

konkrétan arra lennék kíváncsi, hogy tudná minden egyes lapozásnál újra létrehozni a fragmentet (adatváltozás miatt)

[ Szerkesztve ]

(#2048) WonderCSabo válasza eastsider (#2047) üzenetére


WonderCSabo
félisten

Ezzel én már nagyon sokat szívtam. :)

Felül kell definiálni a következő metódust:

@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}

Ekkor mindig meghívja a getItem()-et lapozáskor, ahol pedig visszadsz egy új Fragmentet.

thon73: Nyilván ha van mondjuk egy thread.start() hívás az onCreate()-ben, akkor minden egyes Activity kreáláskor az le fog futni. Erre vagy figyelsz, vagy megoldod máshogy.
Ha küldözgetni akarsz kiíráshoz feladatokat, akkor erre való az IntentService.

Közhely, de minél többet tud az ember, annál jobban rájön, hogy mennyire nem tud semmit. :)

[ Szerkesztve ]

(#2049) eastsider válasza WonderCSabo (#2048) üzenetére


eastsider
nagyúr

az Activityben nem kell semmi pluszt implementálni?

itt adnám át az értéket (PicFragment)
PicFragment fragment = new PicFragment();
Bundle bundle = new Bundle();
bundle.putLong("f_id",getListAdapter().getItemId(position) );
fragment.setArguments(bundle);
Log.i(TAG,"f_id"+bundle);

((FilmActivity) getActivity()).switchFragment(2);

(onitemclick), logCAT ki is írja

ide küldeném: FilmFragment
Bundle bundle = getArguments();
long i=0;
Log.i(TAG,getArguments()+"");
if(bundle != null){
i = bundle.getLong("f_id");
Log.i(TAG,getArguments()+"");
}

if (i>=0) {
select = "("+DbConstants.Pic_db.KEY_FILM_ID+" ="+i+")";

}else
select=null;

(ez onCreateLoaderbeb van), és a loader inicializálásához kell a select feltétel..(adatváltozás)
hol kellene inicializálnom a loadert, hogy megkapja getArguments()-el az adatot?

[ Szerkesztve ]

(#2050) Karma válasza thon73 (#2046) üzenetére


Karma
félisten

Ehhez miért kell Looper? Az ilyen sorosított adathoz a BlockingQueue továbbra is a tiszta, gyári eszköz erre.

[ Szerkesztve ]

“All nothings are not equal.”

Copyright © 2000-2024 PROHARDVER Informatikai Kft.