Hirdetés

2024. április 28., vasárnap

Gyorskeresés

Hozzászólások

(#1701) WonderCSabo válasza fatal` (#1700) üzenetére


WonderCSabo
félisten

Note: a plugin csak annyi, hogy közvetlenül az IDE-ből lehet indítani a devicet, a new device-ra kattintva pedig már a genymotion alap progit nyitja meg.

(#1702) fatal` válasza WonderCSabo (#1701) üzenetére


fatal`
titán

Igen tudom. :)

(#1703) WonderCSabo válasza fatal` (#1702) üzenetére


WonderCSabo
félisten

Ezt inkább Antibazsinak szántam, a te hszedet kiegészítve.

[ Szerkesztve ]

(#1704) Sianis


Sianis
addikt

Tipp arra, hogy hogyan lehet megkerülni a Crashlytics plugin felrakását? Azért API kulcsot még szeretnék kapni! :)

Sianis

(#1705) Karma válasza Sianis (#1704) üzenetére


Karma
félisten

Mondjuk nem rakod fel? Szerintem így nem sok értelme van a kérdésnek... :F

“All nothings are not equal.”

(#1706) Sianis válasza Karma (#1705) üzenetére


Sianis
addikt

De a projektbe be kell rakni. De csak azért nem szeretném feltenni a pluginjüket, hogy egyszer egy api kulcsot betoljon a manifestbe. :)

Sianis

(#1707) Karma válasza Sianis (#1706) üzenetére


Karma
félisten

Jahogyja. Nem jött át a szándék, hogy integrálni akarnád ezt a cuccot a projektedbe, és ott van ez a telepítési mizéria :U

Egyébként meg próbáld meg kézzel berakni a metaadatot.
Vagy ez a tool maga generálná ki az API kulcsot? Mert akkor nehezen tudom elképzelni, ki generálná le helyettük :U

Nem használtam még, TestFlightot illetve saját hibanaplózó cuccot szoktam csak.

[ Szerkesztve ]

“All nothings are not equal.”

(#1708) Sianis válasza Karma (#1707) üzenetére


Sianis
addikt

Jaja, úgy tűnik, hogy ilyen kis sunyik, hogy csak pluginnel lehet. Saját hibanaplózó? Azt hogy? :)

Sianis

(#1709) Karma válasza Sianis (#1708) üzenetére


Karma
félisten

Volt egy szakasz, amikor a BugSense SDK-ja nyílt forráskódú volt, akkor húztam be a forrását, és alakítottam át úgy, hogy az ő rendszerük helyett saját Azure-os backendre küldje a cuccot (eszközadatok, stacktrace főleg), ott meg tárolom és emaileket küldözgetek.

Az androidos oldal lényege egyébként annyi, hogy az Application onCreate-ben meg kell hívni a Thread.setDefaultUncaughtExceptionHandler metódust, ezzel lehet mindent elkapni.

“All nothings are not equal.”

(#1710) Ablakos


Ablakos
őstag

Az onSaveInstanceState methodus textField állapotmentésben nem értem mi a különbség a két kód között:

outState.putString("TEXT",simpleText.getText().toString());
vagy
outState.putString("TEXT", (String) simpleText.getText());

(#1711) rgeorge válasza Ablakos (#1710) üzenetére


rgeorge
addikt

A getText() CharSequence-vel tér vissza, ennek leszármazottja a String. Ha pl. éppen String-et ad vissza, mert pl. a setText-et String paraméterrel hívták meg, akkor a második megoldás is helyes, cast-olható String-gé a getText(). Más CharSequence (Spanned stb.) már nem cast-olható String-gé.
Az első megoldás mindig helyes, a toString() mindig String-et ad vissza.
Mondjuk van putCharSequence is, az talán még jobb lenne:
outState.putCharSequence("TEXT",simpleText.getText());

Picard: "What we leave behind is not as important as how we've lived. After all, Number One, we're only mortal." Riker: "Speak for yourself, sir. I plan to live forever."

(#1712) Ablakos válasza rgeorge (#1711) üzenetére


Ablakos
őstag

Köszönöm, értem.

(#1713) Karma válasza rgeorge (#1711) üzenetére


Karma
félisten

Biztos, hogy jobb lenne, mert a toString() ledarálja a spaneket a szövegről. Mondjuk menteni még sose próbáltam Spannable-t, de a hétköznapi műveleteknél meg megjelenítésnél már szaladtam pofonba.

[ Szerkesztve ]

“All nothings are not equal.”

(#1714) lac14548 válasza thon73 (#1694) üzenetére


lac14548
aktív tag

Megnéztem ezt a memento database-t, de nem igazán fogott meg.
Jobb lenne egy kifejezetten arra a célra készült app ami nekem kell.

- Küldd el, kérlek, pontosan milyen mezők kellenek!
A már korábban említett 3 mező kellene:
1. Szám (ez maximum 10 jegyű betű és szám vegyesen, kis és nagybetű.)
2. megnevezés (itt több is lehet egy számhoz tartozóan, de a keresésnek bármelyikre tudni kell keresni)
3. leírás (ez egy hosszabb szöveges leírás)

A keresés tegyen különbséget az ékezetes karakterekben, viszont a nagy és kisbetűk között ne!

- És milyen "végtermék" kellene? Forrás-project eclipse alá? Vagy csak a kész progi?
A végtermék a kész apk kell, hogy legyen, de ha az adatbázis feltöltéséhez/bővítéséhez/javításához kell a programozási felület, akkor úgy is jó.

A továbbiakat szerintem folytassuk privátban, ne terheljük a fórumot.

Kösz,

/Motorola V2288/Siemens C35/Siemens MT50/Nokia 6600/HTC Touch Cruise/ZTE Blade/Samsung Galaxy S+/Xiaomi Redmi 1S/Xiaomi Redmi 2 Pro/Xiaomi Redmi Note 6 Pro/Realme 8 ...

(#1715) h1ght3chzor


h1ght3chzor
őstag

Semmi, megoldva.

[ Szerkesztve ]

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

(#1716) pittbaba


pittbaba
aktív tag

Sziasztok!

Szeretném a programomat mindig előtérben tartani. Erre olyan megoldásokat találtam, hogy onPause-nál újra indítani kell az activityt ezért ha valami véletlen le is állítja az appot, akkor így újraindul. Egy handlerrel van megoldva, ami onpause-nál 10 másodperc után újraindítja az appot.
Ez általában működik is, láthatóan home gomb nyomásakor eltűnik majd visszajön stb..

A gond az, hogy reboot után a telefon szintén BootReciever-el indítja az appot, és ha ilyen módon indul el (nem az sdk-ból futtatom) akkor két perc múlva valamilyen ismeretlen folyamat kilövi az appot, és a logok szerint onPause() még lefut, de a benne lévő handler már nem.

Ha nem handlerrel indítom újra akkor végtelenül folyamatosan ugye onpause-onresume felváltva futnak.
Érdekes, hogy onstopig illetve ondestroy-ig nem jut el, valahogy mégis elszáll a handler is.

Ha az sdk-ból futtatom a programot, érdekes módon nem ez történik.

Az autó lockscreent is az app tiltja, ébren tartom a telefont, működik is, viszont mikor a hibajelenség felmerül, és az onPause lefut, akkor valamiért bejön a lockscreen is azonnal.

Van erre valami magyarázat? Ha kell még infó/kód, írjátok!

PH Konfigom: Gigabyte GA-H97M-D3H, i7 4790K,GTX 960, Seasonic SS-620GM

(#1717) thon73 válasza lac14548 (#1714) üzenetére


thon73
tag

Engem se fogott meg :N Ezért csináltam sajátot. A program kész, csak átírom a mezőket. Kis türelmet mégis kérek (munkahely, egyebek), de sztem. hétvégén küldöm. Az ékezetekkel nem értek egyet, mert uis. pl. én is ékezet-mentes bill.zetet használok. Egyébként egy kódtábla átírásával gyakorlatilag bármilyen keresési megfeleltetés beállítható, úgyhogy kipróbálhatjuk az ékezetes keresést is. Üdv!
Azért írtam ide, mert úgy gondoltam, ide küldöm - hátha más is érdeklődik.

[ Szerkesztve ]

(#1718) thon73 válasza pittbaba (#1716) üzenetére


thon73
tag

Lehet, h. hülyeség, amit gondolok, de a "kilövés" az egész Application process-t érinti. A handler azon belül van, - elvileg - az is megszűnik. Arra kellene rájönni, hogy miért lő ki a rendszer egy előtérben lévő Applicationt? B lehetőség: Ha esetleg nem az application process indítaná a handler-t? Pl. service - bár ezzel nincs tapasztalatom.

(#1719) pittbaba válasza thon73 (#1718) üzenetére


pittbaba
aktív tag

Szerintem is ez lehet a gond, és gondoltam a service-re is, csak már annyira ágyúval verébre módszernek érzem...
Nincs ötlet esetleg hogy deríthetném ki mi lövi ki az appot? És érdekes h csak reboot után történik.

PH Konfigom: Gigabyte GA-H97M-D3H, i7 4790K,GTX 960, Seasonic SS-620GM

(#1720) Karma válasza pittbaba (#1719) üzenetére


Karma
félisten

Egy dolog hogy ágyúval verébrének tűnik, de ha egyszer ez a rendeltetésszerű használata az Androidnak, nem pedig szembemenni a UI életciklussal, szerintem nem kéne kategorikusan elvetned.

Nem nagy cucc egyébként egy Service osztályt írni, én is meglepődtem az első után, visszatekintve a félelmeimre.

[ Szerkesztve ]

“All nothings are not equal.”

(#1721) pittbaba válasza Karma (#1720) üzenetére


pittbaba
aktív tag

Igen, este gondolkoztam rajta es ez a hivatalos jo megoldás, csak nem értem hogy lehet az h onpause után nem jon onstop ondestroy, a feladatkezeloben ott az app, megis minden timer, handler működés leáll. Nem en megyek szembe az activity ciklussal hanem az oprendszer. :)

PH Konfigom: Gigabyte GA-H97M-D3H, i7 4790K,GTX 960, Seasonic SS-620GM

(#1722) fatal` válasza pittbaba (#1721) üzenetére


fatal`
titán

Eleve szembemész az android működésével avval, hogy a home gombra visszahozod előtérbe az appod :)

(#1723) Karma válasza fatal` (#1722) üzenetére


Karma
félisten

Támadt egy ötletem ez alapján: mi lenne, ha az app UI része egy custom launcher lenne, és az lenne az alapértelmezett a telefonon? :)

“All nothings are not equal.”

(#1724) pittbaba válasza Karma (#1723) üzenetére


pittbaba
aktív tag

Hunfatal: Ez tök jogos igen...
Karma: Igen, akik erre kerestek választ, volt hogy ezt találták végső megoldásnak. A baj ha fejlesztés végén vagyok már, és most ezért átszervezni az egészet.. hát nem tudom... főleg hogy már minden működni látszik, és most ilyen idiótaságot kell debuggolni...

A service egyébként tényleg nem volt egy nagy ügy, már szépen működik is. Azt nem értem, hogy ha feladatkezelőben kilövöm az appomat akkor a service miért áll le, hisz pont az lenne a dolga hogy ne tegye ezt?
Nem a memória ürítése részt használom, hanem feladatkezelő, s az appomat kiválasztva befejezés. A service-ben lévő handler ami időről időre csekkolja a háttérben h fut e az alkalmazás is elhal. Miért?

Telefonos kapunyitót akarok készíteni IOIO van a telefonra kötve, egy éve szórakozok vele, hogy stabil legyen, de lassan feladom, mert egyszerűen mindig kijön valami hiba amivel nem tudok mit kezdeni.

Fut egy webserver app is a telefonon az csinálja a legtöbb gondot, mert egyszerűen egyik WS appot sem képesek megcsinálni úgy hogy a háttérben automatikusan elinduljanak a szolgáltatások :(
Sajnos az USB kezelés is vicc, 5-ből 2x kapaszkodik össze a IOIO-val és csak rebootokkal lehet orvosolni ha nem sikerül, ezért szeretnék írni egy önjavító funkciót, ha leszakad a IOIO akkor addig rebootol amíg össze nem csatlakozik. Na itt van a gond, reboot után a WS programon belül gombbal kell indítani a lighttpd-t meg a mysql-t (nem tudom mi értelme ennek így de az összes appan így van). Adjatok már tanácsot, mindig kapok itt 1-2 jó tippet amivel tovább tudok haladni, hátha most is lesz valami okosság...
Ti a webserver részt hogy oldanátok meg?

PH Konfigom: Gigabyte GA-H97M-D3H, i7 4790K,GTX 960, Seasonic SS-620GM

(#1725) WonderCSabo válasza pittbaba (#1724) üzenetére


WonderCSabo
félisten

Nem ertem mit szeretnel? Egy webszervert telefonon futtatni? Az Android komponenseinek eletciklusa teljesen korrekt, logikus es alaposan felepitett. Olvasd el reszletesen.

[ Szerkesztve ]

(#1726) pittbaba válasza WonderCSabo (#1725) üzenetére


pittbaba
aktív tag

Vannak letölthető appok amik csomagban adnak webservert php modullal illetve mysql servert, és phpmyadmint. Ilyeneket próbáltam, volt amit meg is vettem, de mindegyiknél az a baj, hogy a server indítása gombnyomáshoz kötött, ami meg esetleg beállítható h bootkor startolja a servert az is néha bugos, nem indul a server automatikusan telefon reboot után, de a webservert kezelő app fut.
Ilyenkor az én appom ezt érzékeli és újraindítja a webservert kezelő appot, de az továbbra sem mindig indítja el magát a webservert. Ezért olyan megoldás kellene, hogy lenyúlok magáig a webserver programig és azt indítom.
A webserver azért kell, hogy le tudja kérni a programom hogy az adott bejövő hívás telefonszáma benne van e az adatbázisban, mert csak akkor nyit az ajtó. Azért nem sima appon belüli adatbázist használok, mert valahogy távolról tudnom kell adminisztrálni, ezért json -al adom át az adatot a mysqlből az appnak.

Mivel szeretném hogy minden éjszaka legyen egy automatikus reboot, ezért fontos hogy megoldjam reboot után minden felálljon rendben, ha pedig nem akkor próbálja javítani.

Remélem sikerült normálisan leírnom. :)

A ciklusokat értem, sokat tanulmányoztam, rengeteget teszteltem már, de még mindig hajlamos vagyok bekavarodni.

PH Konfigom: Gigabyte GA-H97M-D3H, i7 4790K,GTX 960, Seasonic SS-620GM

(#1727) eastsider


eastsider
nagyúr

Sziasztok!
valaki foglalkozott már AR drone alkalmazás feljesztéssel android alatt?
van külön SDK-ja.

(#1728) Sianis válasza eastsider (#1727) üzenetére


Sianis
addikt

Mókás dolog lehet. :)

Én még nem.

Sianis

(#1729) Karma válasza pittbaba (#1726) üzenetére


Karma
félisten

Azért erre egy LAMP stacket bedobni a telefonra hogy távolról konfigurálható legyen igencsak overkill... Olyan baltával faragott vaskarika, fából.

Ha a telefon úgyis internetre lát folyamatosan, én kidobnám az egészet a kukába, és leraknék egy webservice-t valahol ami megmondja egy telefonszámról hogy valid-e vagy sem. Ingyen futtathatsz ilyet Azure-ban (Mobile Service-szel még kódolnod se kell), OpenShiften, Herokun, Google App Engine-en, és még ki tudja hány másik helyen.

Az életben tartáshoz egyébként használhatod az AlarmManagert is, periodikusan ráhívva a service-edre, így az Android biztosan beindítja, ha nem futna. Szerintem megérné.

[ Szerkesztve ]

“All nothings are not equal.”

(#1730) pittbaba válasza Karma (#1729) üzenetére


pittbaba
aktív tag

Úgy indult, de mivel a lényeg pont az, hogy nem biztos h mindig neten tud lenni, a wifi instabil, viszont nyitnia mindig kell, ezért lett a választás a localhost, na meg a sebesség miatt is. Szóval ha elfelejtek előfizetni internetre, akkor sincs kimaradás, ha lefüstöl a router akkor sem. Naponta több mint 100 alkalommal van belépés, így fontos lenne hogy offline is működjön.

Most próbálom megoldani okosba, több időt kap a webserver reboot után, így eléggé összekapja magát és most mint ha ez a része jól menne (még sok tesztelés vár rá)

Sajnos a IOIO miatt előtérben kell tartani az appot, most átgondoltam az alapján amiket mondtatok, és sikerült kicsit barátságosabban megoldani a futás ellenőrzést.
A service dolog bevált, onPause-nál meg egy változót átbillentek igazra így a service-nek meg tudom mondani, hogy éppen fut e a program, vagy csak háttérben van, és ehhez képest előtérbe hozom, vagy elindítom. Még nem hibátlan mindig, de már egy szebb megoldás. Köszönöm a mai tanácsokat :)

PH Konfigom: Gigabyte GA-H97M-D3H, i7 4790K,GTX 960, Seasonic SS-620GM

(#1731) Karma válasza pittbaba (#1730) üzenetére


Karma
félisten

Persze most már mindegy, de olyat is lehetett volna csinálni, hogy a cloud service-ből az app frissítés idején lehúzza a teljes táblát, és egyébként offline reszel.

“All nothings are not equal.”

(#1732) thon73


thon73
tag

Bocsánat, ha nagyon alapot kérdezek:
Az android forráskódban mindig synchronized( mLock ) kifejezés szerepel. Miért nem a védett tartalomra (mondjuk egy array-listre) szinkronizál, miért kell egy külön objektumot erre létrehoznia? (Azt értem, hogy ez miként működik, csak azt nem, hogy ez így miért jobb?)
Én ugyanis eddig mindig a védett tartalmat írtam be.

A másik hasonló kérdésem: ha ugyanazt a file-t külön szálakon is írom, de minden szál külön nyitja meg (tehát nem közös leírót használnak), akkor ugye nem kell a szálakkal és a szinkronizálással törődnöm, a rendszer sorba rakja a kiírt adatokat? (Mindig csak egy sornyi append van, tehát a program oldaláról nem feltétlenül kellene külön lock-olnom a file-t)

Gyakorlatilag működik a program, csak azt nem tudom bizonyítani, hogy elvileg is mindig működőképes lesz. Köszönöm!

(#1733) Karma válasza thon73 (#1732) üzenetére


Karma
félisten

1) Bevett gyakorlat, hogy a lockhoz használt objektum egy mindentől független, kívülről nem látható, de belül se cserélhető (azaz final) tagváltozó legyen. Ezzel biztosítható, hogy csak ez az egy osztályod lockolhasson az általa védett dolgai körü
l, külső kód véletlenül sem; és hogy nem cserélheted ki másik példányra egy mellényúlással. Vesd össze, ha mondjuk egy ArrayListre lockolsz és van egy gettered a listához, más is rálockolhat és bedeadlockolhatod a programot. Vagy adatok újratöltése után új ArrayListet hozol létre.

Más jelentősége tudtommal nincs.

2) Akkor eddig szerencséd volt, hogy az írás és a fájlhandle lezárása gyorsabban lement, minthogy ütközzenek... [link]

[ Szerkesztve ]

“All nothings are not equal.”

(#1734) thon73 válasza Karma (#1733) üzenetére


thon73
tag

Aha! Köszönöm. 1. pont alapján a kódot javítottam.

2. Eddig multithreadet (a rendszer által kínált lehetőségeken kívül) csak időzítési feladatokra használtam. Viszont - a log szigorításával - szükségem lett volna egy "saját" log-ra, amit akkor is használhatok, ha tableten dolgozom. A program nagyon egyszerű, egy file-ba írja az üzeneteket. ((Az esetleges összeomlás miatt a metódus nyitja-írja-zárja a file-t (flush is lehetne helyette, de az idő nem volt lényeges szempont)). Ilyen üzenet bármelyik thread-ről érkezhet, ezért szeretnénk biztos lenni abban, hogy működik.

Két megoldást találtam a figyelmeztetésed után:

private final Object lock = new Object();

private static String addTextToFileLog( File logFile, String text )
{
synchronized( lock )
{
OutputStreamWriter logStream = new OutputStreamWriter( new FileOutputStream(logFile, true));
logStream.append( text );
logStream.flush();
logStream.close();
}
}

illetve:

private static synchronized String addTextToFileLog( File logFile, String text )
{
OutputStreamWriter logStream = new OutputStreamWriter( new FileOutputStream(logFile, true) );
logStream.append( text );
logStream.flush();
logStream.close();
}

(A hibaellenőrzést az egyszerűség kedvéért töröltem.)
Van előnye egyik vagy másik megközelítésnek? Egyáltalán jó ez így, vagy valamit elnéztem?
Ha még abban tudnék egy kis segítséget kapni, hogy ezt hogyan tesztelhetem a szimpla próbálkozáson kívül, azt is megköszönném!

[ Szerkesztve ]

(#1735) Karma válasza thon73 (#1734) üzenetére


Karma
félisten

Az első verzió biztosan nem fog működni, mert a lock objektum példányváltozó, míg a metódusod statikus. A lockot "static final"-ként deklarálva ellenben működhet.

Egyébként a két megoldás között a különbség pont az, amit kifejtettem korábban: ha a synchronized kulcsszót használod a metódus szignatúrájában, akkor vagy a this (példánymetódus esetén), vagy a class objektum (statikus esetben) lesz a lock. Mindkettő elérhető kívülről, így +1 deadlock faktor.

[ Szerkesztve ]

“All nothings are not equal.”

(#1736) Benex


Benex
senior tag

Sziasztok!

A computerschookl-ba járok Debrecenbe és szoftverfejlesztőnek tanulok. Nyári gyakorlatot keresek , ami android szoftverfejlesztéssel kapcsolatos.(Mivel iskola elvégzése után is ezzel szeretnék foglalkozni) Sajnos eddig nem találtam magamnak egy helyet sem , ahova tudnék jelentkezni , mivel nincs "hallgatói jogviszonyom".3 éve fogllakozok androiddal, így minden téren ( pl. romolgatás( virtuálisan ubuntu os-on rom forgatás ), kernelek cseréje , és android alkalmazások írása ( egyenlőre alapszinten )). Ha tudnátok nekem segíteni , lehetőségeket mondani, hogy hova próbáljak jelentkezni, nagyon megköszönném.

Ismert programozói nyelvek: Java(alap),C++( 1 éve tanulom,középszinten vagy még jobban is megy ), HTML ( 5 ),CSS,SQL.

Alapszinten beszélek angolul és Németből most tervezek nyelvvizsgát középszinten(április-május körül, és ezután 1-1,5 éven belül angolból is szeretnék ).
Előre is köszönöm szépen a segítségeteket, nagyon fontos lenne ez nekem :R

Üdv: Benex

[ Szerkesztve ]

Proud owner of S21Ultra and Watch 4

(#1737) Sianis


Sianis
addikt

Adott egy screen, lényegtelen mennyi minden van rajta. x mp tétlenség, tehát nem ér semmihez, semmilyen módon, fel akarok dobni egy kis tippet. Utána ezt elrejteni y idő után, vagy érintés után.

Van erre valami jó kis módszer? Az a bajom, hogy mindennek nem adhatok onTouchListener-t, hiszen van neki sajátja, meg ezért egy Button-ból nem csinálnék külön sajátot.

Minden ötletet szívesen látok.

Köszi!

Sianis

(#1738) thon73 válasza Sianis (#1737) üzenetére


thon73
tag

Vicces, most derült ki mennyire topa vagyok a multithread-del, mégis megosztom egy volt ötletem. Én scrolloztatni akartam a képet, amíg a delikvens hosszan nyom egy pontot. A longpress nem jó, mert az csak egy dolgot csinál meg utána, aztán megint vár. Sztem. neked ugyanez kell fordítva: Ha érintés történik, akkor megszakítod a thread-et.
Egy két kódrészlet:

TouchThread touchThread;

@Override
public boolean onTouchEvent(MotionEvent event)
{
...
case MotionEvent.ACTION_DOWN:

touchDirection = 1;
touchThread = new TouchThread();
touchThread.start();
break;

case MotionEvent.ACTION_UP:

if (touchThread != null)
touchThread.interrupt();
break;
}
...
}

private class TouchThread extends Thread
{
@Override
public void run()
{
// Csak vár, hogy hosszú nyomás legyen
for (int cnt=0; cnt<3; cnt++)
{
sleep(100);
if (isInterrupted())
{
touchThread = null;
return;
}
}

// Innentől történik a gyorsuló görgetés
int pause = 150;
while(true)
{
for (int cnt=0; cnt<15; cnt++)
{
sleep(pause);
if (isInterrupted())
{
touchThread = null;
return;
}
// Itt kérjük meg a görgetést az UI száltól !!!!!!
touchThreadHandler.sendEmptyMessage(0);
}
if (pause > 85)
pause -= 30;
}
}

// A görgetést a Handler fogja elvégezni
private Handler touchThreadHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
if (touchDirection >= 0)
rollForwardLine();
else
rollBackwardLine();
touchState = 0;
invalidate();
}
}
}

Ezt elég régen írtam, aztán megszakadt a dolog. Egyébként nem csak az időzítést tudja, hanem egyre gyorsul is a görgetés, amíg nyomod a képet.
Bocs, hogy a kód összetöredezett, amíg kiszemezgettem, de sztem a lényeg érthető. Mint kiderült, nem vagyok (még) teljesen otthon a thread-ekben; (ha valaki hibát talál, és szól, köszönöm); de a kód prímán működik.

[ Szerkesztve ]

(#1739) Sianis válasza thon73 (#1738) üzenetére


Sianis
addikt

Kicsit egyszerűbre vettem a figurát. Raktam az egész elé egy View-t, ami invisible. Ennek lett egy OnTouchListenere, ami mindig false-t ad vissza, így nem avatkozik bele az alatta lévő bármilyen elem működésébe, ugyanakkor leállítja a postDelayed-del megadott Runnable-t ami megjelenítené a tutorialt. Miután megjelenik a tutorial, elindul ugyanígy egy másik Runnable, ami pedig amint lejár eltűnteti a tutorialt és törli a láthatatlan view-t is így végképp kikerül a zavarási eshetőségek közül.

Sianis

(#1740) thon73 válasza Karma (#1735) üzenetére


thon73
tag

Bocs, :B farkas hiba! Nem is lehet pédányváltozó, mert az egész osztály nem példányosított.
Szóval a private static final Object lock lenne a jobbik megoldás. Köszönöm! :R Tanulok, csak lassan.

(#1741) thon73 válasza Sianis (#1739) üzenetére


thon73
tag

Egyszerűbb, célszerűbb.
Nekem emlékeim szerint egy fejvakarásom volt, az UI műveleteket először nem a Handlerbe tettem, ami tilos. Vagyis nem az UI szálon dolgozni velük.

(#1742) Sianis válasza thon73 (#1741) üzenetére


Sianis
addikt

Amúgy. Otto. Tudja azt, hogy létrehozol egy olyan bus-t, ami main szálon fut mindenképpen. És akkor nincs ilyen probléma, meg handlerbe sem kell postolgatni mindig. Meg tud még egy pár dolgot helyetted.

Sianis

(#1743) Karma válasza Sianis (#1739) üzenetére


Karma
félisten

Ezzel az egyszerűsített formával már nagyon közel kerültél az általam ismert legtisztább megoldáshoz (szálakat indítani igazi borzalom volt), viszont még mindig eggyel több felesleges holtjáték van benne: ez a láthatatlan View felesleges, ugyanis az Activitynek van egy onUserInteraction metódusa, ami akkor hívódik meg, ha a felhasználó piszkálja az appot.

Ezt használhatod a Handler takarításához.

[ Szerkesztve ]

“All nothings are not equal.”

(#1744) thon73 válasza thon73 (#1740) üzenetére


thon73
tag

Még egy utolsó kérdést hadd tegyek fel:
A file írás nem mindig történik meg a záráskor sem (Ezt RandomAccessFile esetén tapasztaltam, még a program bezárása után is hozzányúlt, igaz, csak a metaadatokhoz).
Nem biztonságosabb a FileLock használata az esetemben? Vagy ugyanazt az eredményt érem el, mint a synchronized védelemmel?

(#1745) Sianis válasza Karma (#1743) üzenetére


Sianis
addikt

Bakker! Elrakom ezt az infót, ki is fogom próbálni. :R

Sianis

(#1746) Karma válasza thon73 (#1744) üzenetére


Karma
félisten

Ez a kérdés alapján Androidon a FileLock pont az ellen nem véd, amit te csinálsz a fájllal, azaz egy processzen belül két szál között nem csinál semmit...

Szerintem egyébként a teljes elképzelés rossz, a fájlt egyetlen objektumnak szabadna csak írnia, és akkor nem kellene lockolgatni semmit. Például egy háttérszál, akinek van egy BlockingQueue-ja, amibe mindenki más belerakhatja a kiírandó szövegeket, ő meg bedarálja ha van mit, a többi időt meg altatásban tölti.

“All nothings are not equal.”

(#1747) thon73 válasza Karma (#1746) üzenetére


thon73
tag

Aha. Ezt nem olvastam, csak a doksit. Akkor tényleg nem véletlenül írják, hogy Android alatt ez nem használható.

Megnéztem a "hivatalos" Log-ot is, de az teljesen használhatatlan (nekem), mert alacsony szintű hívással az op-rendszer logját írja, amit viszont én nem tudok kiolvasni. (Ill. csak PC kapcsolatban, meg rootolt készüléken)

Még nem tudok teljes mélységben válaszolni, de próbálkoztam, olvasgattam, és érdekes eredményeket kaptam.
1. A külön file-író thread azért is nagyon jó ötlet, mert akkor ez nem is lassítja pl. az UI thread-et. Az elkészítéstől egy kicsit megriadtam, de nekiláttam. ITT találtam egy hasonló elgondolást, ebből annyi látszik, hogy ez nem lesz olyan egyszerű.

2. A Channel thread-safe egy programon belül. Hm. ezt nem tudtam, pedig a doksi is egyértelműen ezt írja.

3. ITT azt az okosságot írják, hogy Channelen kívül NEM lehet többször (tehát több threadból) írásra megnyitni egy file-t. (Ez szerintem nem igaz, én írtam file-t egyszerre több nyitott úton keresztül, igaz egy thread-en.)

4. Ez a legérdekesebb: leteszteltem. Csináltam több párhuzamos thread-et, mindegyik ugyanazt csinálja: megnyitja/írja/bezárja ugyanazt a file-t, mégpedig OutputStreamWriter(FileOutputStream) úton. (Igaz, ez pufferelt, de a puffer többszörösét írtam ki, kb 2 Mbyteot, 4 threadról.)

Nem létezik, hogy soha ne ütközzenek. Mégis, az összes kiírás tökéletes! Tettem elé time-stamp-et, sokszor egyforma, mégsincs hiba!!

Vagyis: Minden elmélet ellenére gyakorlatilag lehet egyszerre több threadról írni ugyanazt a file-t. Most akkor ez hogyan lehet? Mégis "thread-safe" lenne az alacsony szintű írás androidon?? Lehet, h. itt működik, más java környezetben meg nem??

(#1748) WonderCSabo válasza Sianis (#1737) üzenetére


WonderCSabo
félisten

Én is az onUserInteraction-t akartam írni, de látom Karma megelőzött. Az Otto tényleg veszett jó cucc én is csak ajánlani tudom.

(#1749) kemkriszt98


kemkriszt98
aktív tag

Sziasztok, nem tudom hogy ez off-e (nem tudom hogy kódból érdemes megoldani vagy valami beállítással )
Az a lényeg ennek az intentnek a kezelésére(?) a legalkalmasabbnak a skypeot találja az android nekem meg az alapértelmezett telefon alkalmazás kellene:

Intent i = new Intent(Intent.ACTION_CALL,Uri.parse("tel:" + number));

"Tigris, tigris, csóvafény éjszakáknak erdején, mily kéz adta teneked szörnyü és szép termeted?" -William Blake-

(#1750) kemkriszt98 válasza kemkriszt98 (#1749) üzenetére


kemkriszt98
aktív tag

Bocs, megint elfelejtettem a barátom : Google :)

"Tigris, tigris, csóvafény éjszakáknak erdején, mily kéz adta teneked szörnyü és szép termeted?" -William Blake-

Copyright © 2000-2024 PROHARDVER Informatikai Kft.