Auf innere (Thread)Klasse zugreifen, von anderer Klasse aus

camou

Mitglied
Hi all,

ich bin manchmal noch ein wenig verwirrt bei den Java-Strukturen.

Also ich habe folgende Klassenstruktur: Die Main-Klasse, die eine innere Klasse (oder Unterklasse?) namens Counter enthält und als Thread funktioniert.

Nun habe ich auch noch eine andere Klasse "ServiceTemplate". Die soll zur bestimmten Zeit, den Thread starten.

Im Code sieht es ungefähr so aus:
Java:
public class MainAcitivity extends Activity {


class Counter extends Thread{
//Thread tut, was ein Thread so tut
}

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main_acitivity);

//hier ist es mir (logischerweise) möglich den Thread normal zu starten
}


}

// neue Klasse

public class ServiceTemplate extends Service {

  public void onStart(Intent intent, int startid) {

Counter c = new Counter(); //Fehlermeldung


}

}
Wie kann ich nun von ServiceTemplate auf Counter zugreifen?
Ich habe Counter counter = new Counter(); ausprobiert, aber da meckert der Compiler.


Fehlermeldung:
"No enclosing instance of type MainAcitivity is accessible. Must qualify the allocation with an enclosing instance of type MainAcitivity (e.g. x.new A() where x is an instance of MainAcitivity)."

Allem Anschein nach, soll ich erst über die MainAcitivity gehen. Aber wie genau? Und warum nicht direkt? Wie gesagt, manchmal blicke ich sowas noch nicht so ganz... bei Java bzw. OO allgemein.

Ich würde mich über ein wenig Hilfe oder Stichpunkte freuen. :)

Gruß
 

geqoo

Bekanntes Mitglied
Man sollte keine nicht-statischen inneren Klassen von einer Activity instanzieren.
Wenn du die innere Klasse instanzierst, dann musst du zuerst die äußere Klasse (also deine Activity) instanzieren. Activities sind aber nur zum Laufen gedacht, und sollen nicht über new instanziert werden.

Es können also nur statische innere Klassen ohne den äußeren Kontext instanziert werden :)
Daher: Mache deine Thread-Klasse static, dann sollte es gehen.
 
Zuletzt bearbeitet:

dzim

Top Contributor
eine "public static" vor die Klassendefinition könnte helfen, Aber: In dem Fall wäre es sinnvoll, die Threadklasse gleich ordentlich aus der anderen zu entfernen.

Nur zur Info: Ich denke mal, du willst einen Service, der einen Counter startet, welcher wiederum in der GUI irgend etwas macht. Ohne deine Implemementierung zu kennen, denke ich aber, das die von dir hier aufgezeigte Architektur möglicherweise nicht funktionieren könnte (aber probiere es von mir aus vorher).
Du solltest die Kommunikation zwischen Service und UI via Messanger abwickeln, bei der der Message Handler dann auch auf die UI zugreifen darf (sonst kann es zu InvalidThreadAccess kommen). von dem Handler (der darf auch gerne eine innere/anonyme Klasse der Aktivity sein) aus kannst du dann den Thread starten/stoppen/... (in dem Fall kann er auch weiterhin als innere Klasse in deiner Aktivity bleiben).
Entweder also registrierst du in allen UI Klassen, die es interessiert, einen Handler für die entsprechenden Nachrichten, oder aber (so mache ich es) du hast einen zentralen Handler, der die anderen UIs via langweiligem und selbstgeschriebenen EventHandler benachrichtigt (auch nicht so schön, aber fand ich zu dem Zeitpunkt am übersichtlichsten).

BTW: Ich seh gerade du kannst natürlich auch mit Broadcasts um dich werfen, dann brauchst du halt den entsprechenden BoradcastReceiver...

Bsp.: Android Service Tutorial (Lars Vogel präferiert anscheinend Broadcasts)
Service | Android Developers (Hier werden die Remote Message Services gezeigt)
 

camou

Mitglied
Hey, mit static hat es funktioniert. Danke :)

An dzim: Das werde ich mir mal merken für (m)ein nächstes Projekt. Weil du hast mit deiner Vermutung ganz gut ins Schwarze getroffen. Aber so funktioniert es und iwo habe ich mal den Spruch gelesen: never change a running system... oder so? Also auch an dich dank ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Android Auf ImageView aus einem anderen Thread zugreifen liefert Fehlermeldung (App stürzt ab) Android & Cross-Platform Mobile Apps 5
J Android zugrif auf Thread nach Handy drehen. Android & Cross-Platform Mobile Apps 10
A Von verschiedenen Klassen auf Thread zugreifen Android & Cross-Platform Mobile Apps 2
M Android Stop Swipe Refresh aus anderem Thread Android & Cross-Platform Mobile Apps 2
ms_cikar Thread / Intent als externe klasse Android & Cross-Platform Mobile Apps 1
G Thread in einer Service erstellen Android & Cross-Platform Mobile Apps 0
M App Programmierung: Thread starten und Variablenwerte oder Objekte mitgeben Android & Cross-Platform Mobile Apps 2
A Android Von einem Thread auf anderen zugreifen Android & Cross-Platform Mobile Apps 3
C new Thread oder setRunning = true/false Android & Cross-Platform Mobile Apps 12
S Android Kommunikation zwischen UI -> Service -> Thread Android & Cross-Platform Mobile Apps 4
G Pause ohne sleep und ohne zweiten Thread Android & Cross-Platform Mobile Apps 5
G Pause im Programmablauf ohne extra Thread Android & Cross-Platform Mobile Apps 2
JAVAnnik Android Layout ändern in Thread Android & Cross-Platform Mobile Apps 2
Gossi Android Gossis Android Fragen Thread Android & Cross-Platform Mobile Apps 3
H Android ListView Images aus dem Internet via Thread Android & Cross-Platform Mobile Apps 3
L Android Thread Android & Cross-Platform Mobile Apps 4
Kidao Wie startet man ein Thread richtig? Android & Cross-Platform Mobile Apps 4
G Thread und Midlet Android & Cross-Platform Mobile Apps 1
B Was fehlt mir hier für diese Klasse? ich habe es mit (>>> ... <<<) markiert. Android & Cross-Platform Mobile Apps 4
W aus Fragmente in andere Klasse wechseln mit Button Android & Cross-Platform Mobile Apps 3
J Android Datenbank Klasse nur für CRUD-Operation, oder auch mehr ? Android & Cross-Platform Mobile Apps 8
H Android Aufrufen von "setContentView" in einer anderen Klasse Android & Cross-Platform Mobile Apps 3
S Android CheckBox Status von anderer Klasse aus ändern Android & Cross-Platform Mobile Apps 4
M Android Switch-Klasse stoppt Android App / java.lang.NullPointerException Android & Cross-Platform Mobile Apps 5
G Klasse im selben Package aufrufen Android & Cross-Platform Mobile Apps 18
A Fehler beim Starten eines Intents - alles in einer Klasse funktioniert... Android & Cross-Platform Mobile Apps 4
A Kann nicht in TextView einer anderen Klasse schreiben - wieso? Android & Cross-Platform Mobile Apps 9
J Java ME Canvas Klasse Gameloop und Funktion Android & Cross-Platform Mobile Apps 2
M Wie in einer anderen "nicht canvas" klasse zeichne Android & Cross-Platform Mobile Apps 5

Ähnliche Java Themen


Oben