Eclipse zeigt Source not found

  • Antworten:11
Andreas W.
  • Forum-Beiträge: 17

14.04.2014, 05:55:14 via Website

Hallo,
ich bin neu in der App Programmierung (vorher jahrelange Erfahrung mit Delphi) und momentan schier am Verzweifeln mit Eclipse.
Folgendes ist mein Problem:
Ich arbeite mit dem ADT Vers. 22.0.1-685705, welches Eclipse Juno beinhaltet (jedenfalls wird mir die Version 4.2... genannt).
Ich habe ein neues Projekt erstellt und es bei den Standardeinstellungen gelassen (Min SDK Api 8, Target SDK Api 19, Compiled woith Api 19).
Ohne das ich irgendwas verändere läuft die App auf meinem Asus Memo Pad mit Android 4.2.2 und zeigt mir "Hello world" an - wie es ja auch sein soll.

Dann habe ich einen Button auf die Fragmant_main.xml gesetzt, einen onClickListener installiert und gebe einen Toast aus, wenn der User auf den Button klickt.

Diese Änderungen werden ohne Beanstandungen gespeichert. Nur wenn ich die App dann auf das Tab exportiere, installiere und laufen lassen will, heißt es sofort, die App wurde beendet.
Hier mal der Code aus der MainActivity.java dazu:
1package com.example.aa;
2
3import android.support.v7.app.ActionBarActivity;
4import android.support.v4.app.Fragment;
5import android.os.Bundle;
6import android.view.LayoutInflater;
7import android.view.Menu;
8import android.view.MenuItem;
9import android.view.View;
10import android.view.ViewGroup;
11import android.widget.Button;
12import android.widget.Toast;
13
14public class MainActivity extends ActionBarActivity {
15 Button button1;
16 @Override
17 protected void onCreate(Bundle savedInstanceState) {
18 super.onCreate(savedInstanceState);
19 setContentView(R.layout.activity_main);
20
21 if (savedInstanceState == null) {
22 getSupportFragmentManager().beginTransaction()
23 .add(R.id.container, new PlaceholderFragment()).commit();
24 button1 = (Button) findViewById(R.id.button1);
25 button1.setOnClickListener(new View.OnClickListener() {
26 @Override
27 public void onClick(View v) {Toast.makeText(getApplicationContext(), "Button was clicked", Toast.LENGTH_LONG).show();}
28 }
29 );
30 }
31 }
32
33 @Override
34 public boolean onCreateOptionsMenu(Menu menu) {
35
36 // Inflate the menu; this adds items to the action bar if it is present.
37 getMenuInflater().inflate(R.menu.main, menu);
38 return true;
39 }
40
41 @Override
42 public boolean onOptionsItemSelected(MenuItem item) {
43 // Handle action bar item clicks here. The action bar will
44 // automatically handle clicks on the Home/Up button, so long
45 // as you specify a parent activity in AndroidManifest.xml.
46 int id = item.getItemId();
47 if (id == R.id.action_settings) {
48 return true;
49 }
50 return super.onOptionsItemSelected(item);
51 }
52
53 /**
54 * A placeholder fragment containing a simple view.
55 */
56 public static class PlaceholderFragment extends Fragment {
57
58 public PlaceholderFragment() {
59 }
60
61 @Override
62 public View onCreateView(LayoutInflater inflater, ViewGroup container,
63 Bundle savedInstanceState) {
64 View rootView = inflater.inflate(R.layout.fragment_main, container,
65 false);
66
67 return rootView;
68 }
69 }
70
71}


Danach habe ich das Tablett an den PC angeschlossen (mit aktiven debugging mode), bei der Buttoninstanziierung einen Breakepoint gesetzt und die App im debbuging mode laufen lassen. Wenn ich bei dem Breakpoint ankomme und mit F6 "step into" mache, bekomme ich eine Meldung "Source not found" auf die activity.class.

Nun habe ich mittlerweile gelesen, dass man API Code mit step into nicht zu sehen bekommt.
Also habe ich mal versucht, die ganze Button-Geschichte in eine eigenen Methode zu packen und diese dann bei onCreate nur aufzurufen. Der Breakpoint ist natürlich jetzt in der eigenen Methode gesetzt.

Das Ergebnis ist das gleiche,

Dann habe ich noch etwas sehr merkwürdiges festgestellt:
Um den Sourcecode für den Screen Shot hier ein wenig übersichtlicher zu machen, wollte ich alle Standardmethoden zuklappen. Schon bei der ersten kam sofort die Meldung "Source not found" aus der "Activity.class"


Hier ist mal ein ScreenShot von dem SDK-Manager:


Alle zugeklappten API's sind mit "nicht installiert" gekennzeichnet.

Jetzt verstehe ich gar nichts mehr und bin völlig genervt.

Irgendwie verstehen ich entweder Eclips überhaupt nicht, oder das Ganze ist buggy, oder ich habe was nicht richtig konfiguriert, oder .....

Also alleine komme ich im Moment nicht weiter. Wäre schön, wenn mir hier jemand helfen könnte. Ich hätte ehrlich nicht gedacht, dass es so schwierig sein wird, ein einfaches, kleines Programm unter Eclipse zum Laufen zu bekommen.

Gruß
Andreas!

Antworten
Georg C.
  • Forum-Beiträge: 235

14.04.2014, 07:29:29 via Website

Hallo Andreas,
Du kommst aus der Delphi "Welt", und ich aus der Java "Welt" - wobei Android eigentlich Java ist .... und habe auch "Anfangsprobleme".
Die SDK Konfiguration sieht schon gut aus. (Als Entwickler habe mir die API´S 8 - 15 mit Installiert.) Unsere Prog. Kenntnisse müssen wir "auf Android" umstellen. ....
Meine erste versuche einfach was "aus dem Arm basteln" war ebenso gar nichts!
Ich habe (außer viele Bücher -und keine Zeit die zu ende Lesen) mir viele Tuts gesammelt.
Die zeigen nämlich wie es gemacht wird. Ich betrachte die Tuts als fertige "Bins" - quasi Methoden - Brauche auf ein Button zu reagieren - gucke / kopiere mir den relevanten code snip aus dem Tut in meine App ... und in 99% Funktioniert das.
Zu Deinem Code:
eine MainActivity soll oder sogar muss in der Regel von einer Activity erben.
Aber (weil ich selber noch keinen durchblick habe) versuche erstmal mit den simplen Tuts.
Mag sein, du wirst sagen; - hier ... ich habe schon > 5000 seitige progs geschrieben .... dann bist Du nicht alleine .... :D
Ich wollte Dir hiermit NUR den Tipp / Rat mit den Tuts geben - SONNST! - warte auf die Android- Profis antworten.

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten
Fabian Simon
  • Forum-Beiträge: 359

14.04.2014, 11:37:56 via Website

Hi,
im Grunde ganz einfach.
Die Klasse activity die du dir anschauen wolltest, kannst du nicht anschauen, da sie sich in einer Libary befindet.
Diese ist natürlich kompeliert und somit kann dir eclipse nicht den Code anzeigen.
Wenn du debuggst, solltest du ein "stepover" bei Mehtoden/Klassen mache, die du nicht selbst entwickelt hast.

Als Tipp:
Entwickle immer mit aktive debugging!
Auch noch ganz wichtig ist die Logcat.
Alle Fehler die in einer App auftreten, werden in der Logcat des Handy/Tablet gespeichert.
Das Android Plugin für Eclipse ist in der Lage, diese auszulesen.
Somit kannst du damit herrausfinden warum die App abstürtzt.

Noch ein Punkt:
Darüber streiten sich zwar die einzelenen Parteien...
aber ich bin immer noch der Meinung :
vermeide innere Anonyme Klassen/methoden.
(Damit meine ich das, was du mit dem OnclickListener gemacht hast. )

Also Poste mal die Ausgabe deiner Logcat dann kann man dir bestimmt weiterhelfen.

Antworten
Andreas W.
  • Forum-Beiträge: 17

16.04.2014, 07:32:40 via Website

Hallo, vielen Dank für Deine Anregungen - leider konnte ich einiges nicht ganz nachvollziehen. Liegt wohl daran, dass ich noch ein wenig neu in der Materie bin.
- Was meinst du mit

Entwickle immer mit aktive debugging!

Ich sehe "nur" das ganz normale debug menue so wie hier: image

  • Was meinst Du mit

innere Anonyme Klassen/methoden

Meinst Du das im setOnClickListener die Methode public void onClick(View v) aufgerufen wird? Das stammt übrigens nicht von mir, das habe ich so unter Developer.com als Beispiel für "

Using an OnClickListener

gefunden.

  • Wenn du debuggst, solltest du ein "stepover" bei Mehtoden/Klassen mache, die du nicht selbst entwickelt hast.

=> Wie kann ich dann Ereignisse und Variablen testen oder auswerten, die von mir innerhalb dieser Methode programmiert sind? Es ist doch wohl eine ganz normale Geschichte, dass man bei einem onClick-Ereignis etwas macht im Sourcecode. Außerdem habe ich auch schon versucht, in dem onClick nur eine eigene Methode aufzurufen, die dann außerhalb liegt. Auch dort bekam ich die Meldung "Source not found".

  • Den LogCut würde ich Dir gerne zukommen lassen - leider weiß ich nicht genau, wie ich das machen soll. Wenn ich debugge erscheint das LogCut-Fenster. Aber da stehen unheimlich viele Einträge drin und nicht alle scheinen was mit dem Debugger zu tun zu haben. Ich weiß auch wie ich den kopieren soll. Vielleicht meintest du ja auch etwas anderes, da Du von dem LogCut auf dem Gerät geschrieben hast. Aber da finde ich nichts.

Bei meiner Suche bin ich dann auch noch auf einen Error-Log gestoßen und habe meinen Augen nicht getraut, was da alles drin stand. Mit den meisten der Eintraege kann ich leider nicht sehr viel anfangen. User uploaded photo

Wenn ich keinen Button und keinen onClickListener einbaue, dann starten die Apps und ich kann sie sogar debuggen und mit "Step Into" Werte aus den Variablen auslesen.

Was ich auch immer noch sehr merkwürdig finde: Wenn ich in der "Java View" am linken Rand auf den Pfeil klicke, der eine Methode einklappen lässt, auch dann bekomme ich bei den standardmäßig implementierten Methoden die Meldung "Source not found"! Kann es sein, dass man Eclipse nach der Installation (außer das man die Java Umgebungsvariable setzt) noch viel mehr konfigurieren muss? Dann habe ich wohl noch so einiges zu tun!

Also so langsam bin ich dabei mich von Eclips innerlich zu verabschieden! Das macht zwar alles auf den ersten Blick einen recht guten Eindruck. Aber ich habe noch nie eine IDE gesehen und benutzt, die in der Praxis so dermaßen kompliziert zu bedienen ist. Das macht irgendwie nicht so richtig Spaß. Ist schon sehr frustig, wenn man gar nicht zum eigentlichen programmieren kommt, sondern sich jeden Tag mit irgendwelchen Fehlermeldungen des Systems herumschlagen muss. Na ja, vielleicht muss ich einfach nur noch ein wenig mehr Hilfe bekommen und ein wenig mehr Geduld aufbringen.

Auf jeden Fall schon jetzt mal vielen herzlichen Dank für die Mühe! Ich starte jetzt erst mal Delphi und lege eine entspannte Runde programmieren ein! Gruß Andreas!

— geändert am 16.04.2014, 07:36:06

Antworten
Fabian Simon
  • Forum-Beiträge: 359

16.04.2014, 10:16:20 via Website

Hujuijui

Ok wo fang ich an...

Innere Anonyme Klassen:

Wenn du sowas machst :

    button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {Toast.makeText(getApplicationContext(), "Button was clicked", Toast.LENGTH_LONG).show();}
}

Nutzt du eine Innere Anonyme Klasse. Denn OnClickListener ist eigentlich ein Interface.... Und ein Interface kann von sichaus nicht als Object leben. (Da es keinerlei Logik besitzt) Deshalb muss du auch die Methode onClick beschreiben.

Man kann es nämlich auch so machen :

       public class BtnClickListener implements View.OnClickListener{
        public void onClick(View v) {
       Toast.makeText(getApplicationContext(), "Button was clicked", Toast.LENGTH_LONG).show();
    }

}

und dann beim Button:

button1.setOnClickListener(new BtnClickListener ());

Next.

Mit dem Aktiven Debugging habe ich nur gemeint, das du das Android gerät immer mit dem Rechner verknüpfen solltest und somit in Eclipse die Logcat siehst und bei Bedarf Debuggen kannst. (Was vielleicht unglücklich ausgedrückt)

Next. LogCat: Die LogCat die du siehst ist schon die Richtige... jedoch solltest du Filter anwenden um nur die Logs zu sehen die zu deinem Projekt gehören. z.B. Projectnamen.

Next. Step by Step Debuggen: Wenn du Debuggst, kannst du dir nur den Code ansehen den du auch geschrieben hast. Du kannst dir natürlich den Inhalt aller Variabeln anschauen jedoch eben kein Code von Libs.

Das heißt z.B.:

String text = "12345Ha";
text.trim();

Jextzt kannst du dir text anschauen. Jedoch sobald der Debugger bei "text.trim" ist musst du ein Stepover machen, da die Methode trim bzw die Klasse String nicht in Codeform foliegt somit sagt er da "Sorce not found"

Antworten
Georg C.
  • Forum-Beiträge: 235

16.04.2014, 13:11:52 via Website

Hi Andreas, der Fabian hat Dir schon vieles erläutern; - warum ich mich aber weiter "einmische" ist:

  • Also so langsam bin ich dabei mich von Eclips innerlich zu verabschieden!

Habe von vielen Jahren genau so reagiert! und auf andere IDE umgestiegen. Damals war alles noch nicht so "sage ich mal einfach" ... Heute ist es mit Eclipse EINFACH!

  • Aber ich habe noch nie eine IDE gesehen und benutzt, die in der Praxis so dermaßen kompliziert zu bedienen ist.

Das habe ich damals auch gedacht, das (vermute Dein) Problem etabliert sich nicht in der IDE, sondern spiegelt noch nicht ausreichende Java / Android API! Kenntnisse.

-

Na ja, vielleicht muss ich einfach nur noch ein wenig mehr Hilfe bekommen und ein wenig mehr Geduld aufbringen.

hmmmmm. - mehr Lesen!

Vielleicht "Fliegt bei Dir" ein altes Laptop / Rechner? Installiere auf dem Computer das:

https://www.eclipse.org/downloads/packages/eclipse-standard-432/keplersr2

Konfiguriere es wie in den vielen Anleitungen im Netzt ...

und "Futter" die IDE mit dem: jetzt auf die schnelle - weil es gibt 100-erte davon: http://www.mkyong.com/android/android-button-example/

Ich GARANTIERE DIR - es wird Funzen! und Dir wieder / endlich! bei Deinen Testen Erweiterungen -> Freude machen.

_________________________________ _

Zur Thread Code:

Innere Anonyme Klassen sind sehr nützlich / praktisch. Für Skeptiker -> die werden bei kompilieren é gesplittert / separat interpretiert. Bei "Hoche Sicherheit" sind sie jedoch nicht zu empfehlen. - STIMT!

Andie, -> probiere es einfach aus.

Die Problematik etabliert sich in der ANDROID - API! Die ist zwar OOP und! .... GOOGLE ... und .... aber anders wie Oracle! ...

Ich bin selber kein "King of Java", habe viele "Java Freunde" und habe die auch gefragt! ... ... PHP (und wage es Script- Sprache zu erwähnen!) wird auch OOP. ... ...

FAZIT: Wir müssen! uns nicht nur an die neue Konventionen zu halten, aber die auch zu erlernen!

LG Georg

Sorry für Gramatik & Stilistik Fehler.

impjor

Antworten
Fabian Simon
  • Forum-Beiträge: 359

16.04.2014, 13:42:38 via Website

Noch ein kurzer Zusatz: Jeder sollte für sich selbst entscheiden ob er inner anonyme Klassen verstärkt verwendet oder nicht. Ich gebe aber 2 Sachen zu bedenken. Wenn jemand nicht weiß, was innere anonyme klasse sind, sollte er sich nicht verwenden! Auch finde ich sollte man einem Anfänger nicht dazu bringen die zu verwenden... da die Person garnicht weiß was er da eigentlich macht. Die wissen dann überhaupt nichtmehr was z.B.: das Listenerprinzip ist und welche möglichkeiten es einem hier bei OOP gibt.

Die andere Sache ist die übersichtlichkeit: Wenn man alleine im Keller vorsich hinprogrammiert, wird einem nicht auffallen, das innere annoyme Klassen in einem größeren Team der übersichtlichkeit schaden.

Deshalb finde ich es auch nicht gut das die schreiber von Anfängertutorials oft innere anonyme Klassen einfach verwenden!

Antworten
Andreas W.
  • Forum-Beiträge: 17

17.04.2014, 03:17:32 via Website

Hallo,

ich hoffe das mit dem Antworten klappt so, wie ich es mir vorgestellt habe: Das es nicht nur eine Antwort auf einen Post ist, sondern alle Beteiligten es sehen können. Ich möchte mich nämlich bei Euch allen bedanken dafür , dass Ihr Euch meiner Probleme so hilfreich und so aufmunternd angenommen habt!!! Ganz toll!!

Das hat mich doch wieder ein wenig aufgebaut und ermutigt weiter zu machen.

Hujuijui

Ok wo fang ich an...

Ja, den Seufzer kann ich verstehen. Ich weiß, ich stehe noch ganz am Anfang mit dem ADT. Ich werde jetzt mal versuchen Deine guten Tipps umzusetzen und weiter viel lernen aus all den Fehlern und Erfahrungen anderer.

Das Debugen habe ich übrigens immer mit angestöpselten Gerät gemacht - mein Rechner ist nicht stark genug, um mit den hohen Anforderungen des Emulators klar zu kommen. Danke für den Tipp mit dem Filter - werde ich nachher mal versuchen und wenn es geklappt hat, dann werde ich das Ergebnis hier nochmal posten!

Das heißt z.B.:

String text = "12345Ha"; text.trim();

Jextzt kannst du dir text anschauen. Jedoch sobald der Debugger bei "text.trim" ist musst du ein Stepover machen, da die Methode trim bzw die >Klasse String nicht in Codeform foliegt somit sagt er da "Sorce not found"

Also das hatte ich schon kapiert und ich konnte mir ja auch schon Variablen ansehen (den Code von Android will ich gar nicht sehen - da gehe ich mal davon aus, dass der stimmt. Die Fehler mache immer nur ich!).

Was ich meinte, ist, was mache ich mit code der innerhalb der "button1.setOnClickListener" Methode steht?

     button1.setOnClickListener(new View.OnClickListener()
 {
@Overridepublic void onClick(View v) {
                 String text = "Hallo" //<<== Hier setze ich den Breakpoint
}

Mein Problem ist, dass ich zu dem Breakpoint bei String gar nicht komme, da mir vorher die Meldung "Source not found " dazwischen kommt. Aber ich werde es nachher nochmal mit Deiner Methode und mit stepover versuchen.

Meine Dank auch sehr an Georg für die vielen aufmunternden Worte und die sehr interessanten Links. Da ist ja jede Menge Stoff vorhanden, den ich mir mal ansehen werde. Da lernt man bestimmt eine ganze Menge dabei!!!

Ich werde also weitermachen und sollte ich jemals eine funktionierende und vielleiche auch noch interessante App hin bekommen - Ihr werdet die ersten sein, die sie bekommen!

Vielen Dank und bis demnächst Andreas!

Antworten
Andreas W.
  • Forum-Beiträge: 17

17.04.2014, 09:49:56 via Website

Hallo zusammen, so ich habe es heute nun nochmal versucht - leider war der Erfolg noch immer nicht gegeben. Ich habe die Main_Activity.java mal nach den Vorgaben von Fabian angepasst (so wie ich es verstanden habe). Aber viel weiter bin ich nicht gekommen. Hier mal die entsprechenden ScreenShots (Sorry, die sind irgendwie alle sehr klein geworden und ich weiß nicht, wie ich die größer bekomme):

User uploaded photo Ich weiß nicht ob es so gemeint war, den Button in onCreate zu setzen und dann die onClick-Methode aufzurufen. Ich konnte es mir nur so erklären.

Beim debuggen bin ich nie auf den Breakpoint gekommen. Habe das Programm laufen lassen (Gerät war angeschlossen) und wenn die Meldung kam, immer F6 für step over gedrückt. Beim LogCat habe ich einen Filter gesetzt auf den Namen des Programms. Aber da kamen laufend Meldungen rein und ich weiß wirklich nicht, wie ich das sichern und zur Verfügung stellen soll. Sorry!

User uploaded photo

Hier nochmal die Meldung "Source not found" in der Java View. Gehörte hier wohl zu dem Programm welches im header genannt wird, kam aber auch noch bei vielen anderen während des debuggens.

User uploaded photo

Ok - ich will nicht nerven! Dies sollte nur der Vollständigkeit halber sein und dass Ihr seht, dass ich schon versuche, Eure Tipps umzusetzen. Ich kann aber verstehen, wenn Ihr jetzt erst mal nichts mehr schreibt. Ich werde versuchen mich im Netz schlau zu machen, mir Tutorials rein ziehen und lesen.

Schöne Ostern denn und danke Andreas!

Antworten
impjor
  • Forum-Beiträge: 1.793

17.04.2014, 18:14:26 via App

Im LogCat sind erst einmal nur die Meldungen interessant, die deine App betreffen. Wenn deine App zum ersten Mal einen Fehler "generiert", erstellt Eclipse so einen Filter automatisch. Von den (mehr oder weniger vielen) Meldungen, die dann im LogCat zu sehen sind, sind nur die wirklich fürs debuggen interessant, die rot sind. Diese roten Zeilen sollte man bei einem Fehler dann auch angeben.

Zum debuggen: Wenn die Meldung "Source not found" kommt, machst du einfach einen "Step Out" (neben Step Over, Step Into etc.). Dann macht Eclipse beim nächsten Befehl weiter, nach dem die aktuelle Funktion verlassen wurde, sprich beim nächsten Befehl in deinem Code.

Wenn Eclipse mal bei einem Breakpoint gestoppt ist, du ein paar Mal Step Over / Into etc. gemacht hast, kannst du auch veranlassen, dass Eclipse bis zum nächsten Breakpoint automatisch "weiter macht" (ich glaube F8, sollte auch neben Step Into sein.)

Bei der nächsten Source not found - Meldung kannst du also auch einfach Eclipse weiter machen lassen, bis dein Breakpoint erreicht wird.

--- Edit: noch ein Nachwort: Ich finde innere anonyme Klassen gar nicht problematisch. Gerade wenn sie nur eine andere Funktion aufrufen sind sie mMn sogar förderlich für die Übersichtlichkeit.

— geändert am 17.04.2014, 18:17:46

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Andreas W.
  • Forum-Beiträge: 17

18.04.2014, 03:09:39 via Website

Hallo Georg, hoffentlich liest Du dies hier noch. Ich habe mir eben mal Deinen Link

https://www.eclipse.org/downloads/packages/eclipse-standard-432/keplersr2

angesehen. Da geht es doch wohl "nur" um ein Standard-Eclipse, welches augenscheinlich nicht das ADT enthält. Heißt das ich müsste mir das dann noch selber als Plugin herunterladen und installieren ? Und warum soll das dann besser sein als das neueste ADT-Bundle (natürlich mit Eclipse), welches ich mir heruntergeladen hatte?

Auf der Seite gibt es allerdings unter

Eclipse Juno Sr2 Packages

einen Download namens

Eclipse for Mobile Developers, (144 MB)

Sollte ich den dann nehmen? Vielleicht kannst Du mich ja nochmal aufklären !

Vielen Dank und viele leckere Ostereier demnächst Andreas!

Antworten
Andreas W.
  • Forum-Beiträge: 17

18.04.2014, 03:11:29 via Website

Hallo impjor,

das klingt sehr interessant und ich werde es nachher mal ausprobieren. Melde mich dann noch mal! Vielen Dank Andreas!

Antworten