Új hozzászólás Aktív témák
-
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.
-
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. -
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.
-
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
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ükNem használtam még, TestFlightot illetve saját hibanaplózó cuccot szoktam csak.
-
bAtt001
addikt
köszi akkor nem sürgetem magam előbb az alapokat átrágom
am miben érdemes fejleszteni, ecplipse-t utálom lassú meg ocsmány is, most kipróbáltam az android studio-t, na ez fényévekkel jobbnak néz ki és gyorsabb, jobban kiegészíti amit írni akarok. szóval melyikkel érdemes?
-
lordjancso
senior tag
Tegnap még késő este állítgattam rajta, és azt vettem észre, hogy egyik pillanatról a másikra működik.
Nem tudom, hogy melyik módosítás lehetett a titok nyitja, lehet hogy a getCount(), mert kezdetben 0-t adott vissza, de aztán megcsináltam. Lehetséges, hogy ez volt a hiba.
Viszont amikor sikerült, annyira örültem neki, hogy rögtön elmentem aludni.Most mindjárt kipróbálom, hogy a getCount() visszatérési értékét 0-ra állítom.
-
pittbaba
aktív tag
Áhh szóval így hívják ezt a megoldást
Az IOIO Looper miatt kellett ilyet használnom, példában volt, és nagyon jól működik!
A Handler is dolgozik szépen, végre készen lett az AppTelefon hívásával szám alapján és Bluetooth mac alapján adatbázisból kérdezve jogosultnak nyitja az ajtót a kis IOIO board. Nagyon jó ketyere, ajánlom mindenkinek, lehet automatizálni a pecót!
-
fatal`
titán
Komplett adb támogatás van (annyi, hogy nem mindig automata, úgyhogy van, hogy kell egy adb connect localhost, hogy lássa az eclipse), úgyhogy gondolom ki. Ha máshogy nem, akkor rootolod
Mondjuk nem tudsz vele mindent tesztelni, nem testreszabható, mint az AVD, igazából felhasználóknak van, nem fejlesztőknek. Én azért kezdtem el használni, mert gyors, nem kell fél órát várnom egy-egy buildnél mire rámásolja az apk-t.
-
Karma
félisten
És megy is a HAXM? Azaz emulátor indításkor írja az AVD Manager, hogy HAX is working and emulator runs in fast virt mode? Mert enélkül nem ér semmit
Nekem egy 4.2.2-es image hidegindítása tíz másodperc jelenleg. Mondjuk elég erős a gépem is - de nagyságrendi eltérésnek nem szabadna lennie. Még a tabletemen is feléled húsz alatt.
-
thon73
tag
Bocs, csak úgy értettem, hogy volt-e már valakinek ehhez hasonló tapasztalata. Neki is láttam egy egyszerűsített tesztkódot írni (az enyém meglehetősen hosszú).
Ez a teszt fragment, egyetlen metódus:public class TestFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
TextView tv = new TextView(getActivity());
tv.setText("Hello világ!");
return tv;
}
}És a lényeg: az activity:
public class MainActivity extends FragmentActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
FrameLayout fl = new FrameLayout(this );
fl.setId(1234);
setContentView(fl);
}
@Override
public void onResumeFragments()
{
super.onResumeFragments();
FragmentManager fragmentManager = getSupportFragmentManager();
TestFragment test = (TestFragment)fragmentManager.findFragmentByTag("TEST");
if (test == null)
{
test = new TestFragment();
}
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(1234, test, "TEST");
fragmentTransaction.commit();
}
@Override
public void onPause()
{
super.onPause();
FragmentManager fragmentManager = getSupportFragmentManager();
TestFragment test = (TestFragment)fragmentManager.findFragmentByTag("TEST");
if (test!=null)
{
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// fragmentTransaction.detach(test);
fragmentTransaction.remove(test);
fragmentTransaction.commit();
}
}
}((Igazából ezeken a kódokon kívül az eclipse saját indítókódján semmit sem kell változtatni, mert a View-k dinamikusan jönnek létre. A rengeteg Log-ot kitöröltem, de akár minden metódus figyelhető a LogCat-ben.))
A LÉNYEG:
Sztem. az indítás során az onResumeFragments-ben hozzáadjuk a "TEST" fragmentet,
leállításnál az onPause-ben eldobjuk. (Ha akarjuk, akkor detach is lehet.)A REMOVE UTÁN SZERINTEM A FRAGMENTNEK EL KELLENE PUSZTULNIA A DESTROY FOLYAMÁN!
Ehhez képest újraindítás után hibaüzenet:
java.lang.RuntimeException: Unable to resume activity {.fragmenttest.MainActivity}: java.lang.IllegalStateException: Fragment already added: TestFragment{40525cf0 #0 id=0x4d2 TEST}Vagyis az eldobott Fragmentünk "visszajött".
Ugyanez történik ID és Tag alapú keresésnél is: az eldobott Fragment megjelenik
Ha két (landscape és portrait) layout között váltogatok, akkor még hibaüzenet sem jön, csak a Fragmentek sokasodnak.
((Világos, ha a remove átkerül a legelejére, akkor nem lesz hiba, de a Fragment megmarad))SZERINTEM:
A Fragment-ek NEM objektumként működnek, hanem sokkal jobban hasonlítanak az Activity-ra. Vagyis: létrehozás után (ez történik objektumok módjára), mindvégig megmaradnak, csak ide-oda kapcsolgathatjuk őket.
Az onRetain...-nál annyi különbség lehet, hogy ott érinetetlenül maradnak meg, itt meg a View újra készül.Ez azért gond, mert ha egyszer egy Fragmentet valamelyik View-ba bekapcsoltunk, akkor ragaszkodik a saját View-jához, más View ID esetén hibát dob.
Képzeljünk el egy szituációt: bal oldalon a lista, jobbra az egyes elemek, külön fragmentben. Ha ezt EGY activityvel oldjuk meg, akkor NÉGY fragmentet kell kezelnünk (2 landscape, 2 külön portrait módban) VAGY ha ugyanazt az Id-t adjuk meg a két külön layout-ban lévő fragmentet fogadó View-nak, akkor csak KÉT fragmentet kell kezelnünk.
Tudom, hogy a KÉT ACTIVITY-vel való kezelést preferálják, de 1. ettől nem tudom meg, miért nem tűnnek el a fragmentek. ((2. Az activity-k közötti kommunikáció miatt ez a megoldás most nem az igazi nekem (de ez a teszt szempontjából lényegtelen))Bocs, ha nem teljesen érthető ez, igyekeztem nagyon rövidíteni a kódot. De már csak azért is hajt a kíváncsiság, hogy ez miként műxik.
-
thon73
tag
Igen, a menü létrehozása tökéletesen megy. A menüt a fragmenten belül hoztam létre, és szeretném is, ha ott maradhatna. A gond akkor kezdődik, ha egy fragment osztály több példánnyal kapcsolódik be, mert akkor minden példány hozzáadja a saját menüjét. Ez idáig logikus is, de ha remove v. replece-szel elveszem a fragment-példányt (és persze a back-stack-ben sincs), a menüje akkor is megmarad. És - noha nincs már hivatkozás elvileg sehol erre a példányra - a menü az activity újraindítása után is megmarad! Minden indításnál új fragment-példányt adtam egy FrameLayout-ba (az előzőt elvileg eldobtam) és több száz bejegyzésem lett a menüben!
Tudom, vissza lehet szerezni a Fragmentet, a gond csak az, hogy ha egyszer valahova becsatoltam, ugyanazt a példányt (külön időpontban sem!) nem lehet másik Layout-ba becsatolni. Ezért kellene két példány egy fragmentből (külön elrendezésben tehát külön időben) de EGY menüvel egyszerre.
Egyetlen ötletem van: az activity onprepareoptionsmenu-jében ellenőrizni, hogy adott taggal van-e élő fragment, és eszerint betenni a menüt. De ha lehet, a fragmenten BELÜL szeretném a menükérdést megoldani. Csak nem megy…A BackStack kérdés egyszerűbb: az nekem is prímán működik. De ha nincs szükségem az utolsó elmentett transaction példányra, azt hogy tudom "visszajátszás" nélkül eldobni? Vagyis csak levenni a stackról, de nem végrehajtani.
Köszönöm!
-
-
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! -
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
Igen! Az egész Loader framework-öt nem értem pontosan hogyan és mire kell használni.
Több dologra is megoldás lehet, az elavult StartManagingCursor-t is felváltaná, ráadásul most pont olyan programot próbálok írni, ami a GTFS txt-ből megcsinálja a SQLite adazbázist, ez sokezer sor, ami miatt az alkalmazás úgy gondolja fölöslegesen vár, és figyelmeztet, megkérdez, akarom e leállítani a futást. Elvileg megoldható, hogy ezek a háttérben fussanak. -
fatal`
titán
Jó tudni, hogy ilyen is van
Bár hurcibálom a beállított eclipset (be van zippelve), szóval mindegy. Esetleg tud a bundle valami extrát azon kívül, hogy benne van az sdk (gondolom) meg az adt plugin?
Más: Használta már valaki a Facebook API-t? HighScoret szeretnék posztolni a falra, de csak egy csomó katyvasz leírást találtam.
-
kacsuszka
aktív tag
Itt az új :
07-31 14:28:09.220: E/AndroidRuntime(4536): FATAL EXCEPTION: main 07-31 14:28:09.220: E/AndroidRuntime(4536): java.lang.RuntimeException: stop failed. 07-31 14:28:09.220: E/AndroidRuntime(4536): at android.media.MediaRecorder.stop(Native Method) 07-31 14:28:09.220: E/AndroidRuntime(4536): at com.example.anotheractivity. record$1.onClick(record.java:64) 07-31 14:28:09.220: E/AndroidRuntime(4536): at android.view.View. performClick(View.java:3591) 07-31 14:28:09.220: E/AndroidRuntime(4536): at android.view.View$ PerformClick.run(View.java:14263) 07-31 14:28:09.220: E/AndroidRuntime(4536): at android.os.Handler. handleCallback(Handler.java:605) 07-31 14:28:09.220: E/AndroidRuntime(4536): at android.os.Handler. dispatchMessage(Handler.java:92) 07-31 14:28:09.220: E/AndroidRuntime(4536): at android.os.Looper.loop(Looper.java:137) 07-31 14:28:09.220: E/AndroidRuntime(4536): at android.app.ActivityThread. main(ActivityThread.java:4507) 07-31 14:28:09.220: E/AndroidRuntime(4536): at java.lang.reflect.Method.invokeNative(Native Method) 07-31 14:28:09.220: E/AndroidRuntime(4536): at java.lang.reflect.Method. invoke(Method.java:511) 07-31 14:28:09.220: E/AndroidRuntime(4536): at com.android.internal.os.ZygoteInit$ MethodAndArgsCaller.run(ZygoteInit.java:790) 07-31 14:28:09.220: E/AndroidRuntime(4536): at com.android.internal.os. ZygoteInit.main(ZygoteInit.java:557) 07-31 14:28:09.220: E/AndroidRuntime(4536): at dalvik.system.NativeStart.main(Native -
SektorFlop
aktív tag
-
SektorFlop
aktív tag
Köszi most már előrébb vagyok, felváltva piros és zöld tökéletes amit írtál, csak ezt a getView-et nem igazán értem még mindig, hogy a feltételbe nem azt szeretném megadni hogy minden második legyen piros, hanem adatbázison van "1" olyan oszlopom hogy állapot, és ha az állapot egy akkor legyen piros, ha az állapot "0" akkor legyen zöld. De nem tudom úgy összehozni hogy a position helyet az állapotott ellenőrizzem.
-
SektorFlop
aktív tag
1) egy példa az új activity megnyitására:
Intent addIntent = new Intent(this, AddFizetes.class);
startActivity(addIntent);2-3) az activityhez tartozó xml-ben van egy GridView, és az adapter pedig egy másik xml fájlba állítja be a sorokat.
Cursor c = dbHelper.getKoltseg();
startManagingCursor(c);
String [] from=new String []{DatabaseHelper.TerhelesNev,DatabaseHelper.TerhelesOsszeg,DatabaseHelper.TerhelesDatum};
int [] to = new int [] {R.id.tvLeiras,R.id.tvKoltseg,R.id.tvDatum};
SimpleCursorAdapter sca = new SimpleCursorAdapter(this,R.layout.rowkoltseg,c,from,to);
grid.setAdapter(sca);nem tudom hogy itt hol kellene hozzá fűznöm a dolgokat, vagy lehet nem így kellene akkor csinálnom?
Új hozzászólás Aktív témák
Hirdetés
- ÁRGARANCIA!Épített KomPhone i5 13400F 16/32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
- Motorola E40 64GB, Kártyafüggetlen, 1 Év Garanciával
- ÁRGARANCIA!Épített KomPhone i5 13400F 16/32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
- Apple iPhone 7 128GB, Yettel függő, 1 Év Garanciával
- ÁRGARANCIA! Épített KomPhone Ryzen 5 7500F 32/64GB DDR5 RTX 5060 8GB GAMER PC termékbeszámítással
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest