Adgang til activity

1 view
Skip to first unread message

anemone42

unread,
May 27, 2011, 5:57:04 PM5/27/11
to Android IHK
Hejsa!

Jeg vil gerne flytte en privat-i-en-activity-klasse ud som sin egen
klasse. Objekter skal dog stadig kunne finde vej tilbage til den
kaldende activity. Hvordan gør man det? This? Getbasecontext? Eller?

Lise

Peter

unread,
May 27, 2011, 6:53:36 PM5/27/11
to Android IHK
Mens vi venter på overdommeren , vil jeg godt fortælle hvordan jeg har
løst tilsvarende problem i min kode.
1. Bruge statiske metoder i den kaldende aktivitet, som kan så kan
kaldes med aktivetetsnavn.metode() eller
2. Kalde en setParent(this) metode fra aktiviteten som opretter en
instans af den anden klasse.
Men jeg er faktisk selv lidt usikker på om det er den rette måde ;-)

Peter

Jacob Nordfalk

unread,
May 29, 2011, 2:44:55 PM5/29/11
to android-...@googlegroups.com
Hej alle,

Har endelig tid til at svare :-)

Det I skal være opmærksomme på er:
1) aktiviteters livscyklus - hvis f.eks. skærmen vendes lukkes aktiviteten ned og en ny instans startes op
2) aktiviteten har referencer til alle dens views og alle dens views og drawables har referencer tilbage til den
3) hvis man har en reference til et opjekt bliver det ikke renset ud af hukommelsen

Pas derfor MEGET PÅ med static-variabler som refererer til aktiviteter eller views eller drawables - evt inddirekte.
De forhindrer at systemet kan rydde op i hukommelsen.
Se også  http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

Til mange formål er det nok at sende applikationens kontekst ud, dvs det man får ud af getApplicationContext().
Det er OK at gemme den i en static-variabel da den netop lever lige så længe som processen (dvs så længe som din app er i hukommelsen).

Til de formål hvor det er din konkrete implementation af aktiviteten der skal bruges fra en anden klasse så overfør den, f.eks. i konstruktøren, og sørg for at din hjælpeklasse ikke refereres andetsted fra, eller at dens reference til aktiviteten slettes igen når aktiviteten bliver lukket ned.

Håber det er klart.
Ellers så send noget kode :-)

Hilsen Jacob



--
Du har modtaget denne besked, fordi du er tilmeldt gruppen "Android IHK" i Google Grupper.
For at sende et indlæg til denne gruppe skal du sende en e-mail til android-...@googlegroups.com.
For at blive afmeldt denne gruppe skal du sende en e-mail til android-ihk-20...@googlegroups.com.
For at få flere valgmuligheder skal du besøge denne gruppe på http://groups.google.com/group/android-ihk-2011?hl=da.




--
Jacob Nordfalk
Undervisning i Android på http://ihk.dk


Peter

unread,
May 29, 2011, 3:45:01 PM5/29/11
to Android IHK
Hej Jacob, er der helt specifik nogen fare ved at have en reference
til aktiviteten (f.eks. ListActivity)
fra en listadapter, som ligger i en seperat klasse ?

Hvis aktiviteten restarter, kan man så risikere at det gamle objekt
fra den aktivitet der lukker ned (f.eks. ListActivity),
ikke bliver fjernet af gc pga en reference i listadapteren ?

På forhånd tak
Peter

Jacob Nordfalk

unread,
May 29, 2011, 4:07:31 PM5/29/11
to android-...@googlegroups.com
Den 29. maj 2011 21.45 skrev Peter <pedr...@gmail.com>:
Hej Jacob, er der helt specifik nogen fare ved at have en reference
til aktiviteten (f.eks. ListActivity)
fra en listadapter, som ligger i en seperat klasse ?

Nej, ikke så længe der ikke er andre end aktivititeten selv der har reference til listadapteren.
 

Hvis aktiviteten restarter, kan man så risikere at det gamle objekt
fra den aktivitet der lukker ned (f.eks. ListActivity),
ikke bliver fjernet af gc pga en reference i listadapteren ?

Hvis listadateren ikke bliver gc'et pga en reference til den, bliver aktiviteten heller ikke.



 

På forhånd tak

Peter

--
Du har modtaget denne besked, fordi du er tilmeldt gruppen "Android IHK" i Google Grupper.
For at sende et indlæg til denne gruppe skal du sende en e-mail til android-...@googlegroups.com.
For at blive afmeldt denne gruppe skal du sende en e-mail til android-ihk-20...@googlegroups.com.
For at få flere valgmuligheder skal du besøge denne gruppe på http://groups.google.com/group/android-ihk-2011?hl=da.

Peter

unread,
May 29, 2011, 5:35:11 PM5/29/11
to Android IHK
Lige til sidst, hvordan kan jeg via applikationens kontekst,
adressere en instans af en aktivitet ?

Det jeg mente mente mht statiske metoder , var at de kunne kaldes bare
man kender
navnet på klassen, man behøver ikke kende instansen.

Mvh Peter

anemone42

unread,
Jun 2, 2011, 1:21:06 PM6/2/11
to Android IHK
Hejsa!

> Ellers så send noget kode :-)

Lidt kode:

...
ArrayAdapter adapter = ArrayAdapter.createFromResource( this,
R.array.categories, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
categoriesSpinner.setAdapter(adapter);
categoriesSpinner.setOnItemSelectedListener(new
MyOnItemSelectedListener());
...
public class MyOnItemSelectedListener implements
OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent, View
view, int pos, long id) {
SpinnerPos = pos;
}
public void onNothingSelected(AdapterView<?> parent) {
// Do nothing.
}
}
...

Min plan er så at lave en setSpinnerPos(...), jeg kan kalde fra min
nye ikke-indre klasse MyOnItemSelectedListener.

Lise

Jacob Nordfalk

unread,
Jun 2, 2011, 7:05:27 PM6/2/11
to android-...@googlegroups.com

Hej Lise,
Det kan du sagtens. Det er jo sådan at en indre klasse har en implicit reference til den ydre klasse den tilhører. At du laver den til en ikke-indre klasse med en eksplicit reference sku ikke gøre nogen forskel.

Hilsen Jacob

anemone42

unread,
Jun 6, 2011, 6:29:17 AM6/6/11
to Android IHK
Hejsa!

Okay, jeg troede jeg havde forstået det, men det havde jeg så
alligevel ikke.

> > public class MyOnItemSelectedListener implements
> > OnItemSelectedListener {
> >            public void onItemSelected(AdapterView<?> parent, View
> > view, int pos, long id) {
> >                SpinnerPos = pos;

Ændrer jeg i min nye ikke-indre klasse til

parent.setSpinnerPos(pos);

> >            }
> >            public void onNothingSelected(AdapterView<?> parent) {
> >              // Do nothing.
> >            }
> >        }

Men så får jeg vrøvl, fordi AdapterView ikke implementerer
setSpinnerPos(). Så prøver jeg at blive kreativ og kalde

if(parent instanceof AddNewQuestion)

så jeg kan caste parent til en klasse, der HAR setSpinnerPos. Men det
giver bare mere vrøvl.

Føler mig noget på herrens mark.

Lise

Jacob Nordfalk

unread,
Jun 6, 2011, 6:45:17 AM6/6/11
to android-...@googlegroups.com
Den 6. jun. 2011 12.29 skrev anemone42 <min...@ommadawn.dk>:
Hejsa!

Okay, jeg troede jeg havde forstået det, men det havde jeg så
alligevel ikke.

så jeg kan caste parent til en klasse, der HAR setSpinnerPos. Men det
giver bare mere vrøvl.

Føler mig noget på herrens mark.

Så duk op i morgen!

http://cwsa.dk/arrangementer/11/programmering-android/programmering-android

Selvom der står at tilmelding er indtil kl 9 i dag så tilmeld jer alligevel... det eneste vi bruger det til er mængden af kage :-)

Hilsen Jacob

anemone42

unread,
Jun 6, 2011, 9:37:22 AM6/6/11
to Android IHK
Hejsa!

> Så duk op i morgen!

Lettere sagt end gjort. Jeg er jo i virksomhedspraktik i øjeblikket,
så det er ligesom det al min tid og energi går til.

Lise

anemone42

unread,
Jun 9, 2011, 7:05:20 AM6/9/11
to Android IHK
Hejsa!

> Okay, jeg troede jeg havde forstået det, men det havde jeg så
> alligevel ikke.

Pludselig fik jeg knækket nødden. Det gik op for mig, at

durationSpinner.setOnItemSelectedListener(new
MyOnItemSelectedListener());

kunne knækkes over til

MyOnItemSelectedListener myListener = new MyOnItemSelectedListener();
durationSpinner.setOnItemSelectedListener(myListener);

og når jeg kunne det, kunne jeg indsætte

myListener.setCaller(this);

mellem de to linjer. Pludselig faldt alt andet på plads.

Tak for forslagene undervejs. Pludselig forstod jeg, hvordan jeg
skulle bruge dem.

Meget stolt over, at jeg har lavet en refactoring, til en ny klasse og
et nyt interface, så duplikeret kode fra 3 steder nu kun er 1 sted.
Juhu!

Lise
Reply all
Reply to author
Forward
0 new messages