Hirdetés
- Milyen TV-t vegyek?
- Amazon Fire TV stick/box
- Blu-ray lejátszók
- Bambu Lab 3D nyomtatók
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- Milyen belső merevlemezt vegyek?
- Nvidia GPU-k jövője - amit tudni vélünk
- Milyen videókártyát?
- Canon MILC: EOS R és M topik
Új hozzászólás Aktív témák
-
Sianis
addikt
Kaptam Beta tesztelői lehetőséget.
Linkelem az Android appot, úgy egyszerűbb. [link]. Telepítitek, beléptek, utána már látszani fog az Apps részen. Aki bejelentkezett, azt már hozzá is adtam.
Sianis
-
-
Sianis
addikt
Kis reklám:
Készülget egy app az xkcd-hez. 4.0 feletti eszközökkel lehet egyelőre használni, hogy a mérete kellően kicsi lehessen. A linken lehet jelentkezni, TestFlight-on keresztül megy terjesztés (legalább lesz tapasztalat az androidos implementációról is). Jöhetnek a visszajelzések bátran ide is. Csak tessék, csak tessék! És köszönöm előre is!
Sianis
-
Karma
félisten
-
Konair
csendes tag
Sziasztok!
GCM-et használok, és kapott üzenetet nem tudom beletenni if-be.
így néz ki:
// GCM által kapott üzenet: akarmi
String message = intent.getExtras().getString("price");String tesztstring= "tesztstring";
if ( message == "akarmi" ) {
...nem fut le...
}
if ( tesztstring == "tesztstring" ) {
...lefut...
} -
moli.hu
őstag
tudja valaki, hogy a dual-simet hogy lehet kezelni? Mintha a .telephony csak 1 simet tamogatna. Valtani kell koztuk? Hogy?
-
Karma
félisten
Ezt nem tudom, de a Play helyett használhatnád a TestFlightot a tesztelés alatt.
-
pigster
senior tag
Google Playjel kapcsolatban kérdezném, hogy lehetséges-e olyan módon feltölteni alkalmazást, hogy csak bizonyos felhasználók tudják letölteni mondjuk tesztelés miatt.
VAGY az van, hogy amit felrakok, az már élesben megy, és bárki letöltheti, aki rátalál? -
Karma
félisten
válasz
SektorFlop
#581
üzenetére
Alt + balshift?

-
SektorFlop
aktív tag
Nagyon buta kérdés lesz, de valahogy sikerült átállítani angol billentyűzetre az eclipsben a bevitelt
De csak Eclipsben
és a google se segít abban hogy állítsam vissza. -
thon73
tag
...feladtam a harcot az Android életciklusainak megértésére. Sztem. a fejlesztők is, API11 felett teljesen más módszereket alkalmaznak.
Segítséget szeretnék kérni: egy príma Wayteq xtab700dc-t szeretnék rábírni az Eclipse-szel való együttműködésre most WinXP, (egyébként linux alatt, ami esetünkben könnyebbnek tűnik).
Android 4.1.1 alatt kell windows driver? Ha igen, tudja-e valaki, hogy ezekhez a remek kínai termékekhez hol lehet szerezni/mit lehet használni?
Van egy "Internal Memory" (pontosabban csak az van...) feliratú fa-struktúrám. (nem rootolt gép). Ez vajon hova lehet be-mountolva? Vagyis hogyan érhetem el programból? (Rögtön a '\' alatt lehet?) Ha esetleg valaki rootolt gépet használ, megnézné?
Előre is hálásan köszönöm!
((Bocsánat, hogy nem tényleges programozást kérdezek, de oda szeretnék eljutni ezzel a géppel is. Másutt nem hiszem, hogy segítséget találok erre a problémára...)) -
-
thon73
tag
Még egy apróság: a problémám abból fakad, hogy a dokumentáció kihangsúlyozza, az onPause után az Activity-t a rendszer kilőheti.
Ezzel szemben többen állítják (és elvileg ez így kell legyen, hiszen az activity csak egy objektum, hogy lehet eltüntetni egy objektumot?), hogy a rendszer Activity-t nem, csak process-t tud kilőni. Márpedig a teljes application egy processben van benne.
De akkor hogyan lehetséges, hogy az egyszerű példaprogramom újra el tud jutni az onCreate-be, onDestroy nélkül. Kilőtte a rendszer a process-t az egész alkalmazás alól?
Kételyek között vagyok - nem értem az egészet.És a source-ban is elég nehéz egy ilyen komplex eseményt lenyomozni... -
thon73
tag
Pontosan. Ha onPause-ban bezárom, akkor nem lesz.
DE:
onPause után a rendszer bármikor bezárhatja a programot, és akkor az onStop ill. onDestroy nem kerül meghívásra. Ha a zárás az onDestroy-ban van, akkor soha nem kerül meghívásra és bezárásra.Ez a helyzet sokkal gyakoribb, mint gondolnánk. Most próbáltam tesztelni: ha home-mal lépek ki a programból, és utána egy csomó minden mást elindítok (ez azért gyakori), akkor az eredeti program figyelmeztetés nélkül bezár ((egyébként a gyakorlatban ez az onStop után következik be, elméletileg már az onPause után is bekövetkezhetne))
Azt nem tudom, zavarja-e az adatbázist és a cursor-t, ha nyitva marad. Szerintem nem, mert adapterről van szó, tehát csak olvasásról.
Zavarja-e a rendszert, ha nyitva marad az adatbázis? Mem-leak?
Vagy ne foglalkozzak az egésszel, mint ahogy a legtöbb példaprogram teszi.Egy ideje olvasgatok erről, de sehol nem találtam korrekt módszert a zárásra. Kivéve az onPause-onResume párosát, de annak meg más baja van. (vagyis túl gyakran kerül meghívásra.) Szerintem az egyik legnagyobb hiba az Android tervezésében, hogy az onPause után megengedett a rendszernek az erőltetett kilépés. Mi a nyavajáért nem fejezheti be ilyenkor a dolgát a program!?
((A listView esetén sajnos teljes activity-ben kell gondolkodni: amíg a listview látszik, addig az adapter aktív, tehát kell a nyitott cursor és adatbázis is.)) -
Sianis
addikt
CursorLoader? Benne van a support-v4 libben és azt állítja magáról, hogy kezeli a cursor teljes életciklusát, nem kell foglalkoznod a bezárással.
Sianis
-
fatal`
titán
"Ez azt jelenti, hogy az onCreate-ben megnyitott adatbázist az onDestroyban kellene bezárni. Ha előbb zárjuk be (pl. onPause), akkor visszatéréskor (onResume-tól kezdődik), nem lesz nyitott adatbázisunk (mivel a megnyitást végző onCreate nem kerül meghívásra!)"
Miért ne lenne? Csak akkor nem lesz, ha az onPauseban lezárod a kapcsolatot.
Legalábbis ez lenne a logikus. Persze nem tudom mennyire jó ötlet nyitvatartani a háttérben, nem csináltam még ilyet csak PC-n, ott meg ugye egész más a helyzet.

-
thon73
tag
válasz
SektorFlop
#573
üzenetére
Kellene. Elvileg. A LogCat tele lesz hibával, ha nem zárod, de a program működik. Alattomos.
A lista jó, ilyen szempontból, csak zabálja a memóriát. Mindent kétszer tárolsz, másolsz, stb. Én csak próbálgatom az SQLITE-t, de a végleges megoldásban több, mint kétszázezer rekordot kellene kezelnem. igaz rövidek, az egész nincs 10 mega. -
thon73
tag
válasz
SektorFlop
#571
üzenetére
Sianis-nak: Igen, ez fontos észrevétel, nem gondoltam rá. Így már akkor is visszaáll az elejére, ha csak pl. megnézek külön egy rekordot, hiszen más Activity kerül előtérbe. Hm.
Ez a téma szerintem sokaknak okoz fejtörést. Honeycomb felett változott egyébként a megközelítés (és én még nem tartok ott), de sajnos, a konkrét probléma ettől még megmarad.
A probléma veleje: az Activity az onCreate-onStart-onResume metódusokon kersztül indul, és rendre az onPause-onStop-onDestroy metódusokon áll le. Ezek persze párban állnak, tehát ha csak az onPause-ig jut a leállás (más kerül az előtérbe), akkor az onResume ponton éled fel a program.
Ez azt jelenti, hogy az onCreate-ben megnyitott adatbázist az onDestroyban kellene bezárni. Ha előbb zárjuk be (pl. onPause), akkor visszatéréskor (onResume-tól kezdődik), nem lesz nyitott adatbázisunk (mivel a megnyitást végző onCreate nem kerül meghívásra!)
DE! ÉS ITT JÖN A BAJ! Az Android rendszer - ha fogy a memória - CSAK AZ ONPAUSE VÉGREHAJTÁSÁT GARANTÁLJA! Simán kihagyja az onDestroy-ban lévő zárást.
Az adapternek viszont végig szüksége van a nyitott adatbázisra, ill. a hozzá tartozó cursorra. Ezért jutottam oda, hogy a listát az onResume-ban kell lekérdezni és megalkotni, aztán az onPause-ban bezárni. Sianis-nak azonban igaza van, ezzel minden apró-cseprő dolog miatt újraépül a lista.Kérdések:
- lehet, hogy nem kell törődni az onPause utáni kényszerleállással? A vélemények szerint kell, saját tapasztalatom nincs (túl nagy a memóriám
)
- javítja-e a helyzetet, ha onPause-ban pl. a lista helyzetét is tároljuk?
- van-e valakinek precízebb ötlete?
- javasolják a singleton-t (Application-ból származtatva), ami járható út; így ugyanis a teljes Application (és nem Activity!) futás alatt nyitva marad az adatbázis (és a cursor). De honnét tudom, hogy véget ért a történet, és be kell zárni az adatbázist?Néha nem látom át, hogy milyen logika alapján képzelték el ezt az egészet. Igaz, én csak amatőrben játszom...
-
SektorFlop
aktív tag
-
Sianis
addikt
Maximum annyi, hogy túl gyakori lehet a meghívása. Jön egy telefonhívás, átnavigálsz egy másik appra, alvó üzemmódba kerül a telefon, átváltasz egy másik Activityre. Van létjogosultsága, de pl engem nagyon zavarna, ha lemegyek egy lista aljára, elrakom a telefont alvóba, majd mikor előveszem akkor megint a lista tetején vagyok, mivel az adapter újra lett építve teljesen.
Sianis
-
thon73
tag
Érdekes. Az egész adapter-kérdést az onResume-ba helyezve is működik. (bocsánat, az előbb elírtam onStart-ra, de az onPause párja az onResume)
Tehát: adatbázis megnyitás, query, majd a simplecursoradapter az onResume-ban van,
cursor zárás, adatbázis zárás az onPause-ban.
((Az más kérdés, hogy a gyakoribb lekérdezés lehet hosszú, de most csak néhány elemről van szó - inkább az elmélet megértésére.))
A kérdés most fordítva merül fel bennem: van valami oka, amiért annyi más (hibaüzenetet adó) megoldás mellett ezt nem találtam a neten? Nekem elméletileg és gyakorlatilag is korrektnek tűnik (időtényezőt nem nézve); szól ez ellen a megoldás ellen valami, amit nem vettem észre? -
thon73
tag
Köszönöm! Mindkét link nagyon hasznos!
Egy újabb apró kérdés, amin nem jutok át (google segítséggel sem). Ki tudja, hogy az adapterben átadott nyitott adatbázist és cursor-t hol kell bezárni? A doksi az onDestroy-t javasolja (és az logikus is, mint az onCreate párja), de a program az onPause után is meg tud lógni...
Vagy hogyan tudom az onStart-ba tenni az adapter elkészítését? Az nem kell az onCreate után kész legyen? (ListActivity-ben) Előre is köszönöm! -
Sianis
addikt
Ezt olasd át. Az explain elmagyarázza neked, hogy a lekérdezés eredménye milyen lépésekből áll. A gyors keresés érdekében kerülni kell a full table scaneket, azok helyére érdemes indexet tenni. Ilyenkor az történik, hogy nem kikeresi az értéknek megfelelő rekordokat, hanem "tudni" fogja, hogy melyik rekordok azok amik megfelelnek a feltételnek.
Sianis
-
thon73
tag
válasz
Mbazsika
#564
üzenetére
Húú. Köszi. Tényleg pofonegyszerű.
((Egy délutánon át keresgéltem, de mindenáron a rendezett adatbázisból akartam kiindulni (rövidzárlat v. mi). Pedig, csak az indexet kellett volna beírnom! Hát, viszek egy csokor szénát a lámáknak...))
Ha jól értem, elég csak megcsináltatni az indexet, a "gyors" kereséssel nem is kell foglalkozni, kiválasztja maga?
-
Mbazsika
tag
-
thon73
tag
Most kezdtem el ismerkedni az Android/SQLite párossal. Lenne egy elméleti kérdésem:
Ha van egy gigantikus adatbázisom, lehetséges-e azt rendezetten tartani, és (a rendezettség miatt) valamilyen módon a keresést felgyorsítani? (felezés, indexelés, stb., maga az algoritmus nem érdekes, csak az hogy miként lehet beletenni a rendszerbe, vagy van-e ilyen benne eredetileg)
Továbbmegyek: ha KÉT szempont szerint kell rendezni az adatbázist (legyen pl. gyógyszernév és hatóanyag páros), akkor tudok-e pl. két indexet létrehozni, és annak segítségével villámgyorsan keresni? Tehát pl. ne kelljen az adatbázist újrarendezni két keresés között, ill. ne kelljen minden egyes gyógyszernéven végigballagni, hogy egyezik-e vagy sem.
Addig eljutottam, hogy az összehasonlítást meg lehet saját módszerrel oldani, de a rendezettségről nem találtam infot. (File-lal megoldottam, de sqlite-ban szeretném ugyanezt.)
Lehet, h. nagyon triviális a kérdés, akkor bocsánat. Egy linkkel is megelégszem, ami a megf. dokumentációra mutat. -
Sianis
addikt
[link] és keresd a Launch controls on stopped applications részt.
Az van, hogy 3.1 felett egy telepített alkalmazás receiverei nem nem hívódnak addig, amíg a felhasználó el nem indítja az alkalmazást. Addig "stopped" állapotban van. Valamint, ha FC-zed, akkor is ebbe az állapotba kerül ([link]), amiből csak akkor mozdul ki, a felhasználó elindítja.
Sianis
-
Konair
csendes tag
válasz
pvt.peter
#548
üzenetére
Elnézést, ha félreérhetően fogalmaztam, a lényeg a kényszerített leállításon volt.
Mert ha bootcomplete-re rakom a boradcastrecievert, akkor is fenn áll ez a gond.
Kényszerített leállítás után nem hajlandó reagálni a boradcastreciever-re.
Amúgy 4.2.2, és status bar-ból kapcsolgattam. -
Sianis
addikt
válasz
SektorFlop
#553
üzenetére
Van a DB kezelőnek amit te tudsz örököltetni egy ilyen metódusa: onCreate. Ebben kell létrehoznod a táblákat és ebben tudod feltölteni is induló adatokkal. Ez csak egyetlen egyszer fut le, amikor legelőször létrejön az adatbázis.
Szerk: #544
Logoltasd ki, hogy mi lett a query szövege. Úgy talán egyszerűbb lesz rájönni, hogy jól állt-e össze a lekérdezés.Sianis
-
SektorFlop
aktív tag
Ebben mit ronthattam el?
A bankrollFilter egy spinner-t takar, aminek a tartalmát adatbázisból szedem. Az else ág eseten force close-ol
bankrollFilter.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1,
int position, long id) {
if (bankrollFilter.getSelectedItem() == "összes"){
balance.setText("$"+db.fetchSumBalance());
} else{
String kliens = String.valueOf(bankrollFilter.getSelectedItem().toString());
balance.setText("$"+db.fetchBalance(kliens));
}
}
public void onNothingSelected(AdapterView<?> arg0) {
}
});Ha kiszedem a SELECT -ből a WHERE feltételt akkor lefut, ha benne hagyom akkor force close.
public String fetchBalance(String kliens){
Cursor c = getReadableDatabase().rawQuery("SELECT "+ PokerKliensDBConstans.KEY_POKER_BALANCE +" FROM "+ PokerKliensDBConstans.POKER_KLIENS_TABLE +" WHERE "+PokerKliensDBConstans.KEY_POKER_KLIENS+" = "+kliens+";", null);
String strData = "";
if (c!= null) {
if (c.moveToFirst()) {
do {
strData += c.getString(0);
} while (c.moveToNext());
}
}
return strData;
} -
SektorFlop
aktív tag
Sziasztok! Számomra egy nagyon érdekes problémába ütköztem. Van egy kliens oldali adatbázisom, amiben lenne egy olyan tábla, amit az első indulásnál feltöltene egy-két sorral. Viszont a későbbiekben ezt a táblát tetszőlegesen szerkeszthetné a user.
Sajnos elképzelésem sincs, hogy valósítsam meg azt, hogy csak egyszer jöjjön létre úgy az tábla. És ne töltse fel mindig azokkal a sorokkal.
-
doboka98
tag
Sziasztok! Az a helyzet, hogy szeretnék készíteni android appokat, és nem tudom hol kezdjem. Programozásban már jártas vagyok, PAWN nyelvhez volt szerencsém, tehát a struktúra nem lenne nagyon ismeretlen. Valaki tudna esetleg pár videó/linket küldeni hogyan kezdjem el? Jó lenne látni egy appomat Play Marketen
. -
thon73
tag
válasz
pittbaba
#547
üzenetére
A példaprogramban az eredményt az AsyncTask osztály tárolja, mert az az újraindításnál megmarad(hat). Az újrainduló Activity létrehozza az üres ListView-t, de azt az AsyncTask osztály tölti fel. Mivel az már lefutott, ezért a beépített rutinok nem indulnak el. Én külön is választottam az eredmény kijelzését végző updateUI-t. Mivel a ListView adatait az adapteren keresztül kapja, lehet, h. elegendő annak megadni az AsyncTaskban tárolt adatokat. Ilyenkor arra kell vigyázni, hogy az Asynctask létezzen az adapter indítása előtt. (Vagy az ellenőrizze a meglétét)
Ezt a "hibát" nem lehet egy sor átírásával megoldani, a program szerkezetét kell megfelelően elrendezni. -
kltz
tag
válasz
pittbaba
#547
üzenetére
A manifest-ben kell beállítani a activity-nél, hogy mit történjen amikor elforgatod.
Ha API Level 13 alatt az configChanges = orientation ,ha nagyobb API Level-t használsz akkor a configChanges = screenSize, de ha mind2 esetben szeretnéd használni akkor configChanges = orientation | screenSize.
Alapbeállítás szerint amikor elforgatod akkor újra indul az activity és ott nem fut le a task. Ha ezeket beállítod és elforgatod nem indul újra csak a layout rendezi át.
Bővebben: [link] -
pittbaba
aktív tag
Újabb kérdésem:
Async taskból feltöltöm a listview-ot, kijelző elforgatásával viszont üres lesz a ListView.
Ezt is a getLastNonConfigurationInstance(); segítségével kellene megoldanom?Nem szeretném az Async taskot csak az elforgatás miatt újra indítani, váratni a usert a lekéréssel, stb, ezért lenne jó, ha destroy után valahogy vissza tudnám adni az értékét.
-
thon73
tag
Bocsánat! Figyelmetlen voltam! Alapvetően az előző hozzászólásra akartam válaszolni. De teljesen igazad van, a ListActivity-ben ez kötelező; én már az expliciten megadott ListView-val voltam elfoglalva, ahol nem. Mégegyszer, bocs!
Az viszont az én kérdésem lenne, mennyivel tud többet egy ListActivity, mint egy sima Activity-n belül elhelyezett ListView? -
pigster
senior tag
Nem tudom, hogy mindent nekem írtál-e vagy sem. De a "kötelező list elem" az nem kötelező list elem, hanem az id kötelezően az kell, hogy legyen, ha ListActivity-ne belül használod a listview-t.
Az másik kérdés, hogy egy-egy listaelem hogyan néz ki. Ezt egy saját adapterrel meg lehet változtatni. -
thon73
tag
Az infot én is úgy találtam egy példaprogramban, de lehet ListView egy sima Activityben is. A setListAdaptert a ListView-n belül kell kiadni.
ListView listView = (ListView) findViewById(R.id.listView);
// Assign adapter to ListView
listView.setAdapter(dataAdapter);
Arra figyelj, hogy az AsyncTask logikája szerint a konfigurációs változásokhoz az Activity alkalmazkodik, tehát a listView-t ott kell "létrehozni" (első sor), viszont a feltöltése történhet az AsyncTaskból is. Bár én inkább úgy oldanám meg, hogy az AsyncTask adja az adatokat az Adapter mögé, és az onPostExecute (vagy az onProgress...) csak az adatok megváltozását jelzi.
((A kötelező list elem csak a "gyári" adapterre vonatkozik, de azt át lehet és szabad (néha kell is) írni, és akkor olyan lista-elemeid lehetnek, amit csak akarsz.)) -
thon73
tag
válasz
pittbaba
#538
üzenetére
Maga a task nem indulhat újra, de egy új példányt elindíthatsz belőle. Ha az AsyncTask értéke non-null (tehát van már futó/futott példány), és a returnedResult is értéket kapott, az azt jelenti, hogy ez az AsyncTask példány eredményesen végigfutott, csak azért tartottuk meg, hogy a returnedResult megmaradjon.
A hiba nem itt lesz, hanem valószínűleg ott, hogy az újraindításnál ugyanezt a task példányt indítod el. De ez csak feltételezés, mert a többi kódrészletet is látni kellene. Mit ír a LogCat? Lefagy v. FC? -
-
pittbaba
aktív tag
Na még valami:
ListView-et akarok kitölteni az async task onpostexecute metódusában, de a setListAdapter metódust elvileg nincs definiálva. Több helyen is így láttam a példákat, nálam miért nem működik?
Így néz ki a dolog egyébként:JSONObject jsonobj = new JSONObject(result);
next_starts = jsonobj.getJSONArray("next_starts");
for(int i = 0; i < next_starts.length(); i++){
JSONObject c = next_starts.getJSONObject(i);
String id = c.getString("departure_time");
//Log.v("TAG","INDULÁS:"+id);
HashMap<String, String> map = new HashMap<String, String>();
JSONObject e = next_starts.getJSONObject(i);
map.put("id", String.valueOf(i));
map.put("start_time", "Codename: " + e.getString("departure_time"));
//map.put("cc", "Country Code: " + e.getString("countrycode"));
mylist.add(map);
}
ListAdapter adapter = new SimpleAdapter(callerActivity, mylist , R.layout.start_times_listview,
new String[] { "start_time"},
new int[] { R.id.start_times});
setListAdapter(adapter);
Log.v("TAG","JSON FELDOLGOZVA"); -
Konair
csendes tag
Sziasztok!
Airplane moda-ra kapcsoltam egy broadcastreceivert, ami elindít egy service-t.
Működik is, és ha rányomok a kényszerített leállításra (nem csak a servicet, hanem a teljes alkalmazást leállítom), le is áll a service.
De innentől a hiába kapcsolgatom az airplane mode-ot, nem reagál rá.
Ha újratelepítem az alkalmazást vagy újraindítom a telefont az sem segít.Ha viszont elindítok egy alkalmazáson belüli activityt, akkor onnantól megint reagál a broadcastreceivere.
A kérdésem az lenne, hogy erről a "tiltó listáról" le tudom-e venni activity inditása nélkül?
A segítséget előre is köszönöm!
-
pittbaba
aktív tag
válasz
pittbaba
#537
üzenetére
Találtam egy kérdéses részt az utolsó előtti részben, nekem kifagyás lett az eredménye, de lehet csak az én logikámban kell máshogy.
StarTask metódusnál az indítás előtti feltételed:
private void startTask(String route_id ,String stop_id){
try {
if (async_task == null || async_task.returnedResult !=null) {
indulhat_a_task... }Ebben az esetben akkor is indul a háttér task, ha már lefutott, de már megvan az eredmény. Szerintem csak akkor kell futtatni, ha a task nem fut(ott), vagy ha nincs eredmény. Így a hibajelenség is megszűnt.
if (async_task == null || async_task.returnedResult ==null) {
-
pittbaba
aktív tag
Rendben, nagyon lassan haladok, mert közben rendes melót is csinálom, de odaérek lassan, és akkor kiderülnek a dolgok számomra

A tesztelésben biztos sokan benne lesznek, sok a fanatikus szerencsére ..
Csak érdekességképpen kérdezem, nem annyira fontos a program szempontjából, de miért lehet, hogy a getContentLength() -1-el tér vissza? Egy ideig jól adta vissza nekem a várt csomagméretet, de mióta JSON bemenetet kap, nem html-t, valamiért ezt kapom vissza. Mi okozhatja?
-
thon73
tag
válasz
pittbaba
#535
üzenetére
Bocsánat, félreértettem.
A dokumentáció szerint az onRetain... helyett a setRetainInstance (boolean retain) használata javasolt. ((Gondolom, kompatibilitási problémák miatt az előző is működni fog.)) Ez más elven működik, nem egy objektumot, hanem az egész fragmentet (ami kb. egy activity, vagy activity rész) őrzi meg. Nagyképernyő és JB hiányában ebben még nem mélyedtem el, csak elolvastam. Megmondom őszintén, más részek sokkal inkább érdekeltek, mint az, hogy a rendszer egy jól ismert részét kicserélték. A nálaménál későbbi gépeken.
((Off: még mindig nem vagyok meggyőződve arról, hogy nyerek valamit a GB rendszer lecserélésével. Szintén SGS2. ÉS: néhány verzióval ezelőtt még nem láttam, h. használhatnék API11 feletti osztályokat - kompatibilitási kiegészítéssel. De lehet h. csak én voltam figyelmetlen...))A static-ról (c-s alapon) én is azt gondoltam, hogy az egyetlen példányt jelöl. DE NEM! (Olvasd el a többi részt is, megvilágosodik, remélem! ebben középen) Csak azt jelenti tehát, hogy a belső osztály v. változó nem a példányhoz, hanem a külső osztályhoz kötődik. Arról valóban gondoskodni kell, hogy EGYETLEN példány legyen, de ezt a fentiekben megtettük. Legfelső szintű osztályként nem kell a "static" és működni fog!
A programot úgyis tesztelni kell először, és akkor kiderül, hogy a tesztelők melyik megoldást tartják jobbnak, és átláthatóbbnak. Sztem. itt biztos találsz olyat, aki buszozik, és szívesen utazik ezzel.
Én beépítenék egy visszafelé mutató ellenőrzést is (a rosszindulatúak elkerülésére nem is teljes körben talán): ha elmozdult egy megálló, akkor visszaszól a központi szervernek, és jelzi a változást. Valahogy úgy, mint a túra-térképeknél leadott útvonal. Meg az igo is megkérdezi mindig "Megérkezett a célhoz?" -
pittbaba
aktív tag
Én itt élek Pesten évek óta, de nem itt nőttem fel, így ez a funkció lesz, igazából pont erre építem az alap szerkezetet. Jó lenne, valami irányzék is, hogy pontosan helyileg oda tudjon menni a user a megállóba, de az később, a kiadott adatbázis amúgy sem a legpontosabb eddigi tapasztalat szerint, de majd.. ez még új dolog

A kérdésem erre a részre vonatkozott:
Ezen a ponton átalakítottuk a belső TimeConsumingTask osztályt static típusúvá, vagyis egyetlen timeConsumingTask létezhet. Hogyan tudnánk ezt megőrizni, miközben az UI-szálon futó alkalmazásunk újraindul? Az Alkalmazkodjunk az új környezethez! Felületi változások c. cikkben már beszéltünk az onRetainNonConfigurationInstance() metódusról, mellyel egy értéket meg tudunk őrizni a program újraindulása alatt. ((Megjegyzendő, hogy ezt a módszert a Honeycomb rendszertől kezdve érvénytelenítették. Az új módszer azonban a Fragment-ek beható ismeretét igényli, ezzel később (ha a gépünket Jelly Bean-re frissítettük) részletesen foglalkozunk.))Én is a frissítés gombra gondoltam megoldásnak, csak nem tudom érteni fogja e a user magától, hogy ha nincs indulási időpont, akkor neki a frissítés gombot kell nyomkodnia, de kitalálom.
Galaxy S2-n meg mini-n tesztelek, még én sem foglalkoztam a tablet méretekkel..
És még valami: Én külön fájlba vettem az Async osztályomat, nem engedi static-ra rakni, hogy ne fusson több egyszerre, azt a hívó activity async startoló metódusában csekkoljam indítás előtt?
-
thon73
tag
válasz
pittbaba
#531
üzenetére
Hogy az előző hozzászólást folytassam:
Én az onPreExec.-ben, vagy a háttérszál legelején (tehát nem az activity-ban!) kérném el, ami már megvan (sqlite lekérdezés). Ezt, ill. a netről érkező adatokat folyamatosan szedném össze, és alkalmanként az onProgressUpdate megjelenítené azokat, ill. jelezné, h. tart a folyamat. Az onPostExecute csak annyit tesz a képhez, hogy "oké, minden adat kirajzolva!"
Ha nincs pl. Wifi, akkor a háttérszál (hiba nélkül!!) befejezi a futást, és valahol kiírja, hogy "nincs net". Ez az az eset, amikor a háttérszál RENDBEN lefut, de a számítás "HIBÁS".
Valahova odateszel egy gombot, hogy frissítés, és akkor - ha éppen nem fut - újraindítja az egészet. Vagy, ha gondolod, időnként - ha éppen nem fut - újraindítja az egészet. Én ez utóbbit kissé "költségesnek érzem", ha látom, hol a busz, nem vagyok kíváncsi arra, hol lesz 10 mp múlva. Vagy legalábbis 3g-n nem, ami a buszmegállóban azért valószínű.Másik ötlet: a lekérések service-ként futnak, amik időnként szólnak a fő programnak, hogy ezt vagy azt írjon ki. Itt talán könnyebb a kettőnél több folyamat indítása, ill. az időzítés; de ezzel nincs sok tapasztalatom. Azt sokan írták, hogy AsyncTask helyett többnyire service-ben gondolkodnak.
Én is gratulálok a BKV kezdeményezéshez, én már a hétvégén ajánlgattam Pesten, h. létezik ilyen (csak nem találtam). Ezek szerint egy kicsit még várni kell rá... De jó lesz nagyon! Hátha még azt is megmondja, hogy egy nagy téren a 8 állásból melyikből indul az én buszom... ((Pestiek előnyben, én szegény vidéki GPS-sel közlekedem))Úúú! csak lemaradtam egy kérdésről. Ami lejárt az a ProgressDialog. Sztem., ettől függetlenül prímán működik, de lecserélhető akár Fragment-re is. Csak az olyan összetetté tenné a kódot, hogy a lényeg eltűnne, ezért maradtam a "régi" megoldásnál. Meg azért is, mert én 5 hüvelyken élek, semmi szükségem (még) a fragmentekre, majd a Note 8"-en
!
Az érték megőrzés másra vonatkozik: a végeredményt az AsyncTask osztályváltozója tárolja. Ha törlöd a mutatóját, akkor elveszik a végeredmény is. De egyébként az AsyncTask nem indítható ugyan újra, de nem veszik el (az eredmény sem), amíg új példányt nem indítasz.
Jól értettem a kérdést? -
thon73
tag
Bocs, lehet h. sokat dumálok.
Az AsyncTask több metódust is tartalmaz, melyek az UI szálon futnak: onPreExecute - a hátterszál indítása előtt, onPostExecute - háttérszál befejezésekor, onCancelled - felhasználói megszakításkor (vigyázat a háttér még futhat!) és az onProgressUpdate a háttérszállal párhuzamosan fut.
Ezek bármelyikében írhatunk az UI elemekbe, ami a háttérszálban tilos! Az onProgressUpdate (amiről a cikk szól), lehetővé teszi akár azt, hogy a háttérben lejátszott pl. zeneszámokat egymás után megjelenítsük. Végső soron ez is a folyamat előrehaladásának jelzése.
Ez azért jó példa, mert azt mutatja be, hogy az egész folyamatot másképp kell szervezni (erre jutottunk mi is végül.)Az eredeti kérdés (hátha tud rá valaki jó választ): A teljes AsyncTask lefutása után (tehát amikor az onPostExecute is már meghívásra került), miként lehet újra felébreszteni az eredeti Activity-t, hogy további tevékenységeket végezzen.
Erre én/mi nem találtunk egyszerű megoldást. Szerintem az egész Android filozófiával ellentmond az, hogy EGY activity TÖBB feladatot végezzen, de hátha lesz valakinek ötlete/tapasztalata ebben. -
pigster
senior tag
Nem olvastam el teljesen a fentieket, de szerintem ilyesmi megoldásban lehet gondolkodni:
http://stackoverflow.com/questions/11080141/how-can-android-service-update-the-ui-of-the-activity-that-started-it -
pittbaba
aktív tag
Szia!
Igen, ma fogok ott tartani gyakorlatban is, hogy a szebb megoldásokat is lépésről lépésre beépítem a programomba. Lesznek nehezítések még a cikked példájához képest, biztos, hogy fogok még kérdezni a témában. Saját adatbázisból próbálom lekérni a kiválasztott BKV járat legközelebb induló járatait. Mivel a legtöbb infót az offline sqlite db-ből szedi, viszont az érzékenyebb nagyobb lekéréseket már a netről, ezért kell nekem főleg az Async task, mivel az adatok egy részét (vonal neve, megállók) már kiírom kiválasztás után rögtön, de lehet az internetről szerzett adatok csak később érkeznek meg és íródnak ki. Szerintem itt jogos az AsyncTask használata. Viszont mi van, ha éppen nem sikerül neki számomra megfelelő adattal visszatérni, mert mondjuk pont nem kapaszkodott fel a wifi? Azt is kezelnem kellene. Illetve, ha elmúlt az adott időpont (elment a következő járat ) akkor újra csináljon egy lekérést, már a frissebb indulási időpontokkal visszatérve, valahogy rá kell vegyem, hogy a háttérben emberi időközönként frissítsen.
A konkrét kérdésemre is megkaptam a választ, annyi volt a gond, amire számítottam is, osztálynévvel ki kellett egészítenem a változónevet, így már látja a változót, nem ír hibát! (van egy temérdek hiányosságom Javaból, PHP-ban dolgozom, nehéz átállni és néha csak úgy nem akar jönni a megoldás)
A cikk kapcsán felmerült egy kérdés: Az érték megőrzése ha bezárult az alkalmazás dolog írtad, hogy a példádban már lejárt. Mikor várható leírás ennek az újabb verziójáról? Fragmentekre kell rákeresnem? Ott lesz a megoldás?
A téma áthelyezése szerintem úgy lenne a legetikusabb mindenki számára, ha innen a diskurzus részeit néha bemásolod a cikked alá is. Mivel valóban ez az egyetlen magyar fórum itt van, hagy legyen meg itt is az érdeklődők számára, hasznos lesz ez egy év múlva, ha már többen mennek neki az Android home fejlesztésnek.
-
thon73
tag
válasz
pittbaba
#529
üzenetére
Egyáltalán nem hülyeség. A legnagyobb gond az AsyncTask-ban, hogy a hívó Activity és az AsyncTask külön léteznek. Pl. indításkor még nem létezik AsyncTask; míg a készülék elfordításakor - átmenetileg - az Activity tűnik el. Valamilyen módon tudnia kell mindkét folyamatnak, hogy létezik-e a másik.
A timeConsumingTask valójában egy "változó", vagy C-beli fogalommal mutató, mely az elindult TimeConsumingTask típusú példányra mutat. Ha ennek null értéket adunk, attól a példány még létezik, esetleg fut is, amíg a GC el nem tünteti. Első próbálkozásra kézenfekvőnek tűnt ezt a változót használni:
- ha értéke null, akkor nincs futó AsyncTask (itt timeConsumingTask-ra bővítettük). Ezt fontos tudni, mert ilyenkor lehet csak pl. újra elindítani az AsyncTask-ot, különben több példány futna együtt, és keverednének az eredmények (nézd meg a log-ot az első próbálkozásoknál, ahol ez megtörténik: egyszerre több háttérfolyamat számol, függetlenül attól, hogy az Activity csak az egyikről "tud". A többit még nem takarította el a GC.)
- ha értéke nemnull, akkor van éppen aktív háttérfolyamat, és az érték arra mutat.
((A C mutatóaritmetika nehéz, de sokkal jobban segít megérteni ezeket a folyamatokat.))
Ki tudja, hogy a háttérszál befejeződött? Hát az onPostExecute metódus! (meg az onCancel is), tehát ők tudják "törölni" ezt a mutatót. Ez teszi lehetővé, hogy a háttérfolyamatot újra indítsuk (már amennyiben szükség van erre). ((De szükség lehet, mert a hibátlan lefutás csak annyit jelent, hogy a HÁTTÉRSZÁL hibátlanul futott! De a számítás nem biztos, hogy megfelelő eredményt adott, mert pl. egy file hiányzott!! Tehát újra kell számolni.))
Azért tudod itt írni a timeConsumingTask változót, mert "belső" osztályként készült az AsyncTask rész. Egyébként is tudnád (ha public), csak pl. callerActivity.timeConsumingTask-ként. Korábbi eszmefuttatás alapján az onPostExecute idején az Activity-nak léteznie KELL, bár ezt azért mindig ellenőriztük.
A későbbi megvalósításokban - mivel a timeConsumingTask null-ra állításával az abban tárolt (returnedResult) eredmény is elveszett - egy belső változó tájékoztatott a timeConsumingTask állásáról. ((Ilyen egyébként a task metódusai között is van, én - részben didaktikai okokból sajátot használtam, lehet még optimalizálni.)) A timeConsumingTask non-null értéke értéke azt jelentette: van már elindított (lehet, hogy befejezett) háttérszál, és a belső "state" változó tudta megmondani, hogy a futás befejezett-e v. sem. Ettől függetlenül a timeConsumingTask non-null értékét ellenőrizni kell, mert lehet, hogy még soha nem is indítottuk el, és emiatt nem is létezik (és akkor belső változói se léteznek, a programunk pedig - nem létező változó olvasásakor FC-t dob).
Van fent egy PackageSave2 cikk is, abban pont egy már meglévő programot illesztettem bele az AsyncTask keretbe. A cikk tartalmazza az üres keretet is, sztem. abból érdemes tovább építkezni.
Két fontos feladat van:
1. Mindkét osztálynak figyelnie kell, hogy létezik-e a másik! (Ez nagyon fontos, ezen lehet elbukni)
2. Gondoskodni kell arról, hogy csak egyetlen (vagy legalább ellenőrzött számú) AsyncTask futhasson egy időben. ((A korábban indítottak is tovább futnak, függetlenül attól, hogy a hivatkozásukat már lecseréltük))A triggerelést próbáltam, de mégis csak felesleges, mert amíg azt be nem fejezi az Activity, addig az onPostExecute sem fejeződhet be. (Voltaképp onnan hívjuk meg az Activity egy metódusát.) Inkább úgy kell szervezni a programot, hogy a Working-thread tényleg working-thread legyen, vagyis ott történjék a "munka", függetlenül attól, hogy egyes részei gyorsak vagy lassúak. Az Activity valójában csak egy indító keret lesz. Azt esetleg érdemes lenne megnézni, hogy ha az Activity-t meghívjuk egy másik Activity-ből, akkor a visszatérést hogyan lehet az onPostExecute-ba, vagy egy onnét triggerelt metódusba tenni. Ha előbb ki tudod próbálni, mint én, akkor mindenképp szólj, kérlek, mert nagyon érdekel!
(((Volna még egy kérdésem, minimálisan off-topic: nem érdemes ezt a diskurzust áttenni a cikkek hozzászólásába? Ott bőven van hely bármilyen hosszú eszmefutattásra. Saját ellenvéleményem: magyar nyelven praktikusan itt van az egyetlen élő fórum (és legyünk büszkék rá!!), tehát érdemes itt megbeszélni a kérdéses pontokat. Még akkor is, ha egy ekkora téma, mint az AsyncTask, nem hogy egy fórumba, de még egy emészthető cikkbe se fér bele.)))
-
pittbaba
aktív tag
Most lehet hülyeséget kérdezek, de a 3. cikkedben az async taskban csinálsz egy metódust, ami a bezárásokkor a timeconsumingtask-nak null értéket adsz. Azt nem értem, hogy az async taskból hogy fér hozzá a hívó activityben létrehozott példányhoz? Nekem olyan hibám van, hogy nincs ilyen változó deklarálva. Mit rontok el?
-
pittbaba
aktív tag
Köszönöm a részletes magyarázatot, egy előre elég lesz nekem az onPostExecute ban feldolgozni az adatokat, ez a trigger dolog viszont érdekes lehet! Most éppen a cikked alapján megcsinálom a kezelést elforgatásra, back gombra stb, hogy jól be legyen betonozva, ezek valóban kötelező feladatok itt.
A cikkeket alig várom, én biztos rámegyek megint, ha jönnek új infók.
-
thon73
tag
válasz
pittbaba
#526
üzenetére
Nem tértem ki, mert eddig ez a probléma nem tűnt fel. Ahol én idáig AsynTask-ot használtam (nem csak a cikkekben szerplő programokban), ott a program célja mindig egy önálló, de nagyon hosszú számítás volt. Ezt általában kiírta file-ba, és azzal már egy következő program (vagy programrész) dolgozott.
Az én esetemben az "eredmény" - vagyis, hogy a kiírás megtörtént - az onPostExecute (pontosabban updateUI) metódusban került kiírásra egy UI elembe. Már, ha volt ilyen. Mindenesetre tovább gondolkodtam.Az onPostExecute egyébként UI szálon van, tehát simán meghívhat, írhat, bármit csinálhat - ha éppen létezik a fő Activity. ((Márpedig itt nagy valószínűséggel léteznie kell, mert mindketten ugyanabban a szálban futnak, tehát amíg az activity az újraindulással van elfoglalva, addig nem futhat az onPostExecute, ha meg ő fut, akkor az Activity nem tud újraindulni.)) Én azt tenném, hogy innen (onPostExecute) meghívnám (vagyis triggerelném) a fő Activity egy metódusát (érdemes azért ellenőrizni, hogy éppen létezik-e). Ez tulajdonképp egy Listener lesz, amit pl. a konstruktorban át is lehet adni. Ez igen egyszerű, és ugyanúgy fog működni, mint ahogy pl. egy gomb lenyomásakor elsül az onClick metódus. Mégis kell egy AsyncTask osztályváltozóban jelezni, hogy már van kész eredmény, mert ha ez megvan (tehát van már elindított AsyncTask és van már eredmény is), akkor a fő Activity (újra)indulás után nem az AsyncTask indítása felé mozdul, hanem a további számítás felé. Bár ilyenkor már a számítás megkezdődött, tehát látni fogod, hogy kiszállt és újraindult a program. De mégsem kell mégegyszer lefuttatni a teljes AsyncTask-ot.
B. (lehet egyszerűbb, csak kevésbé felhasználóbarát) verzió: az onPostExecute felfed egy gombot, ami tájékoztatja a felhasználót, hogy "Oké, megvagyok, mehetünk tovább!". (Megteheti, hiszen UI szálon van!) És azt megnyomva ugrik a végrehajtásra.A másik kérdésre válaszolva: minden AsyncTask-nál el kell készíteni a keretet. Ha csak a paraméterekben van változás (vagyis nagyjából ugyanazt végzi el, még ha egyszer pl. szöveget, máskor meg képet tölt is le), akkor sztem. elegendő egy AsyncTask-ot készíteni, de gyökeresen más feladatokra kénytelen leszel újakat készíteni. Arra még mindig nem jöttem rá, ez mennyiben egyszerűsíti a programot. De biztos van oka, hogy ilyet csináltak.
Nagyon örülök, ha tetszett a cikk, amennyire időm engedi, folytatni fogom. A baj az, hogy most is egyszerre három projekttel (egy billentyűzet, egy adatbáziskezelő és egy könyvolvasó) bíbelődöm, (meg van egy negyedik készen), és mindig lemaradok az írással. De ha van, akit érdekel, akkor igyekezni fogok!
-
pittbaba
aktív tag
ÓÓ hogy ezt te követted el? Akkor először is
és

Ismerősek voltak a szavaid, ezek alapján haladtam én is, de nem láttam, hogy kitértél e arra, hogy hogy kapja meg a hívó az async task által lekért eredményeket.Nagyon jó a cikk, a teljes ködös semmitnemértek ebből verzióból a nagyjából átlátom részig sikerült fejlesztenem magam miután átrágtam a cikket, köszi, nagy segítség.
Igen, ezen gondolkodtam én is, hogy mivel ez háttér folyamat, közben pont az a lényeg benne, hogy az activity meg közben azt csinálja ami a dolga, ne erre várjon, így az asyncen belül érdemes feldolgozni az eredményeket ha jól értem.
Én úgy gondoltam, hogy paraméterben kap az async egy stringet, hogy hogyan dolgozza fel a kapott eredményt, és hova írjam ki éppen. Gondolom nem érdemes minden alkalomhoz külön teljes Async osztályt létrehozni.(?)
Sok ilyen hasznos cikket még!

-
thon73
tag
válasz
pittbaba
#522
üzenetére
Bocs, közben lemaradtam egy válaszról, de amit írtam, továbbra is érvényes.
Ennyire sztem. nem egyszerű. A doInBackground fut egyedül háttérszálon, ez tud egy értéket (melynek típusa beállítható pl. String) átadni, a már nem háttérszálon futó onPostExecute-nek. De ezt az értéket a fő szál csak úgy magától nem fogja megkapni.
Ugyanakkor a megkötés CSAK az UI elemekre vonatkozik, tehát pl. osztályváltozók a háttérszálról is irhatóak (amennyire tudom, a teljes Application (és szálai) egy heap-en helyezkednek el). A fondorlat abban van, hogy az AsyncTask osztály és a hívó Activity nem feltétlenül létezik ugyanabban az időpillanatban! Az érték átadásakor ezt figyelni kell, ez a legnagyobb buktató!
Ha egyszer elindul, akkor az AsyncTask osztály létezni fog addig, amíg fut v. hivatkozunk rá. Akkor is, ha a háttérszál befejeződött. Így az tűnik a legjobbnak, ha az eredményt egy AsyncTask osztályváltozó tartalmazza, és abból olvassa ki a hívó Activity. A nagy kérdés az, hogy miként értesül a fő Activity arról, hogy futás befejeződött. Ehhez be kell építeni egy Handlert, de akkor kérdéses, hogy érdemes-e AsyncTask-ot használni. Vagy: az AsyncTask get metódusa várakozik, amíg be nem fejeződik a futás. Ezt még nem próbáltam, kérdés, h. ez nem jelenti-e a fő szál leállítását (sztem igen). És akkor még mindig fel kell készíteni arra a fő activity-t, hogy pl. a kép elfordítása során újraindul, mégis ellenőrizze le, nem áll-e rendelkezésre egy kész AsyncTask eredmény.
((Az AsyncTask-kal kapcsolatos tapasztalatokról - mivel elsőre én sem értettem miként működik - írtam egy hosszabb cikket: [link]. Felmerült bennem a kérdés, hogy egyáltalán van-e valami előnye más megoldásokhoz képest.)) -
pittbaba
aktív tag
Igen, ezt vágom is, egy kicsit bonyolultabban de mégis egyszerűbben akartam megoldani. A meghívó activitin belül nem tudom visszakapni az értéket, csak az onPostExecute-n belül, ezért kicsit nehézkesebb a feldolgozás, hogy innen-onnan hívom meg, de nem ott tudom feldolgozni az eredményt.
Így is jó egyébként, csak paraméterben akkor el kell küldenem, hogy éppen hogyan dolgozza fel az Async taskon belül az eredményt. -
pittbaba
aktív tag
Sziasztok!
JSON formátumú weblap tartalmát szeretném AsyncTask segítségével lekérni, majd az AsyncTaskból valahogy a fő szálamba visszaadni a kapott eredményt (String).
Hogy lehet ezt kivitelezni?
-
köszönöm! Ez lesz a baja, mert a telefon 4.1.1, az api17 meg 4.2.2. Ha csak simán kimásolom a bin mappából akkor viszont működik szerencsére. Akkor az első lépéseket megtettem
Ez a java így elsőre valami borzalom. Pascalt, meg php-t tanultam, meg használtam, ahhoz képest elég fura. -
Sianis
addikt
válasz
SektorFlop
#519
üzenetére
Érdemes pedig, mivel nem tudni az újabb rendszerek meddig fogják támogatni.
-
SektorFlop
aktív tag
Egyébbként minap épp TabHost-okkal egészítettem ki egy alkalmazást, és megdöbbenve láttam hogy az Eclipse elavultnak jelezte a TabActivity-t, rákerestem, hogy mire cserélték le. Gondoltam megpróbálom megírni akkor FragmentActivity-vel, de 1 óra szerencsétlenkedés utána döbbentem rá hogy én ezt nem fogom tudni működésre bírni, így maradtam a jól bevált TabActivity-nél.
-
Mbazsika
tag
válasz
SektorFlop
#516
üzenetére
Szenvedek vele, de értékelhető produktumot még nem sikerült kicsiholnom belőle (a hiba bennem van vszinűleg)
-
SektorFlop
aktív tag
Készített már valaki diagrammot?
-
Karma
félisten
válasz
Victoryus
#512
üzenetére
Vagy az Eclipse-ben is tudsz APK-t exportálni, ha a File -> Exportot választod.
A target és a minimum SDK-t jól állítottad be? Mert hasonló hibát ad pl. ha egy JB minimum projektet akarsz futtatni 4.0-án vagy előbbin...
Pigster: egy utility függvény miatt felesleges leszármaztatni az Applicatiönből. A második megoldás a jobb a kettőből (legalább egy önálló egysègbe kerül a kód).
Az alternatíva az, hogy a műveletet amit ide raknál, abba az osztályba rakod amihez kapcsolódik. Persze ez beépített típusoknál nem pálya.
-
sziasztok! Kérnék egy kis segítséget! A hello world android programnál tartok. A problémám: emultároron lefut szépen, de igazi telefonon nem, azt írja az eclipse, hogy installation cancelled.

Telefon: Zte GrandX. debug módban van. Mit kéne még beállítanom, hogy végre fusson? Illetve hogy lehet apk-nak lementeni egy projektet, ha már így nem hajlandó futtatni a telefonom, akkor rámásolnám?
-
pigster
senior tag
Globálisan elérhető/haszálható függvényt/metódust szeretnék használni. Több megoldást is olvastam, érdekelne, van-e valakinek tapasztalata ezzel kapcsolatban.
Egyik megoldás
Application objektumból saját osztály leszármaztatása, és azon belül a metódus implementálása:public class MyApp extends Application {
public void myFunc() {
//
//itt történik valami
//
return;
}
}Amikor pedig szükség van rá:
MyApp myApp = (MyApp) getApplication();
myApp.myFunc());Másik megoldás
Statikus metódus külön osztályban:public class Util{
public static void myFunc(){
//
//itt történik valami
//
return;
}
}Amikor pedig szükség van rá:
Util.myFunc();
Szóval, van-e ajánlott módszer, esetleg a fentieken kívül más megoldás?
(Szerk.: a kódformázás valamiért nem működik)
-
pvt.peter
őstag
Sziasztok!
Egy kérdésem lenne.
Adott egy Android alkalmazás felülete.
A felületen vannak bizonyos GUI elemek.A kérdésem: XML elemek tudnak-e közvetlenül egymásra hivatkozni?
-
SektorFlop
aktív tag
Sziasztok, egy alkalmazást publikálni szeretnék, de csak egy nagyon távoli országban(Magyarországon ne legyen elérhető). Hogy tudnám, itthonról tesztelni ezt az alkalmazást? A Play és az alkalmazás együttes viselkedését? (pl. frissítés)
-
hmate91
csendes tag
Hali!
Csináltam egy rendkívül egyszerű alkalmazást, ami már majdnem úgy működött, ahogy szerettem volna, erre felrakom a 2. tabletre is (össze-vissza 2 tableten kéne egyenlőre futnia az app-nak, ráadásul azonos típuson) és az nem rakja ki nekem teljes képernyőre, hanem kis telefonos nagyságban hagyja. Sajnos nem is értek hozzá, úgyhogy valaki jó szájbarágósan elmagyarázná, hogy mi lehet a problémám megoldása?
Köszönöm!
(wayteq xtab70 ha segít
) -
válasz
angiel3546
#504
üzenetére
-
angiel3546
csendes tag
Hello!
Szeretném megkérdezni,hogy hátha tud nekem valaki segíteni van egy HUAWEI U8230 mobilom amin a párom próbált androidot frissíteni de azóta a telcsi bekapcsol és csak a Red Bull jön elő és kikapcsol.Hogy lehet visszaállítani az eredeti szoftverét?
-
Karma
félisten
Én Windows 8-on jártam ugyanígy,de sajnos nem sikerült megoldani, újrahúztam végül az egész hóbelebancot. Azt hiszem próbáltam az update site-on keresztül foltozni, de nem sikerült neki.
A dolog kellemetlenségét fokozza, hogy a legújabb bundle-ben az Eclipse összefosta magát (nem találta meg a saját bundle-jeit), amint feltelepítettem a Subclipse-et. Na ilyet látott már valaki?
-
thon73
tag
Találkozott már valaki olyannal, hogy az Eclipse nem látja az ADT update-t? Viszont indításkor kéri. A help/install alól is elakad.
ADT-bundle van fenn, Ubuntu 12.04LTS alatt. És itt (kivételesen) közvetlen - proxy és egyebek nélküli - net van. Köszönöm!
((B verzió: teljes bundle újratelepítése, de sajnálom rá az időt. Meg lesz még update később is…))
Új hozzászólás Aktív témák
- Inno3D GeForce RTX 4070 Ti X3 12G - Karácsonyi akcióban!
- Redragon Kumara K552 RGB Brown Switch magyar billentyűzet
- Lenovo Thinkpad P1 Gen 6 - i9-13980HX, 32GB, 2TB SSD, 16" WQUXGA (3840 2400), RTX 4090
- 15.gen! Intel Core Ultra 9 285K +16-32GB DDR5 RAM +hűtött VRM-es Z890 lap! GAR/SZÁMLA (a Te nevedre)
- OP AudioCodes C450HD Ip Phones - Szines kijelzős - Teams/ Zoom telefon - Új dobozos
- Új, Aktiválatlan iPhone 17 Pro Max (256 GB) (rendelhető)
- Surface Pro 7+ i5-1135G7 16GB 1000GB 1 év garancia
- Új, Aktiválatlan, iPhone 15 (128 GB) (rendelhető)
- DELL PowerEdge R740 rack szerver - 2xGold 6130 (16c/32t, 2.1/3.7GHz), 64GB RAM, 10Gbit HBA330, áfás
- Dell Latitude 5400 14" FHD IPS, i5 8365U, 8-16GB RAM, SSD, jó akku, számla, 6 hó gar
Állásajánlatok
Cég: Laptopszaki Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest



De csak Eclipsben

.
!



