Leider wurde "meine app" beendet

  • Antworten:25
Jürgen
  • Forum-Beiträge: 50

30.07.2014, 17:41:40 via Website

Hallo,

es ist schon wirklich lange her, als ich mal für mich und ein paar Freunde eine kleine App geschrieben habe.
Allerdings habe ich bei der Nutzung auf Android 4 ein kleines Problem damit, was ich einfach nicht lösen kann und etwas Hilfe brauche.

Zu meiner App gehört ein Service, der automatisch immer gestartet wird und zyklisch nach einem File im Internet sucht.
Ist dieses File vorhanden wird einiges in der App aktiv, zb. eine Notification.

Soweit funktioniert das auch alles außer :

wenn ein Gerät mit Android 4.x.x recht beschäftigt ist mit anderen Dingen,
(dieser Fehler ist mit 2.3.x nie aufgetreten!)
kommt eine Meldung "Leider wurde APP beendet."

Im Simulator kann ich das nicht nachstellen zu Debuggen, da ich diesen nicht zu einer derartigen Auslastung zwingen kann.

Falls die Frage so nicht zu beantworten ist, kann ich auch die entsprechenden Codeschnippsel posten.

Wie immer bin ich für jegliche Hilfe sehr dankbar.

Gruß
Jürgen

Antworten
Philipp B.
  • Forum-Beiträge: 131

30.07.2014, 18:13:54 via Website

Jürgen

Hallo,

es ist schon wirklich lange her, als ich mal für mich und ein paar Freunde eine kleine App geschrieben habe.
Allerdings habe ich bei der Nutzung auf Android 4 ein kleines Problem damit, was ich einfach nicht lösen kann und etwas Hilfe brauche.

Zu meiner App gehört ein Service, der automatisch immer gestartet wird und zyklisch nach einem File im Internet sucht.
Ist dieses File vorhanden wird einiges in der App aktiv, zb. eine Notification.

Soweit funktioniert das auch alles außer :

wenn ein Gerät mit Android 4.x.x recht beschäftigt ist mit anderen Dingen,
(dieser Fehler ist mit 2.3.x nie aufgetreten!)
kommt eine Meldung "Leider wurde APP beendet."

Im Simulator kann ich das nicht nachstellen zu Debuggen, da ich diesen nicht zu einer derartigen Auslastung zwingen kann.

Falls die Frage so nicht zu beantworten ist, kann ich auch die entsprechenden Codeschnippsel posten.

Wie immer bin ich für jegliche Hilfe sehr dankbar.

Gruß
Jürgen

Hi Jürgen,

kannst du mir mal den Code schicken? Ich schau mal drüber

Antworten
Jürgen
  • Forum-Beiträge: 50

30.07.2014, 18:59:09 via Website

import java.util.Timer;
import java.util.TimerTask;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class FileScannerService extends Service implements ConstDaten
{
public static Main MAIN_ACTIVITY;
private Timer timer=new Timer();

private final IBinder fsBinder = new FsBinder();

private static final String LOG_TAG = FileScannerService.class.getSimpleName();

public static void setMainActivity(Main activity)
{
  MAIN_ACTIVITY = activity;     
}

public class FsBinder extends Binder {
    FileScannerService getService() {
        return FileScannerService.this;
    }
}


public IBinder onBind(Intent intent) {
    if(DEBUG)
        Log.d(LOG_TAG, "FileService onBind!");
    return fsBinder;
}

@Override
public void onCreate()
{
  super.onCreate();     

  _startService();

  if (MAIN_ACTIVITY != null)  Log.d(getClass().getSimpleName(), "FileScannerService started");

  //bprReciver
  context = this;
  mBroadcastReciver = new bprReciver();
  context.registerReceiver(mBroadcastReciver, intentFilter);
}

@Override
public void onDestroy()
{
  super.onDestroy();

  _shutdownService();

  if (MAIN_ACTIVITY != null)  Log.d(getClass().getSimpleName(), "FileScannerService stopped");

}

/*
public static boolean toast = false;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if ((flags & START_FLAG_REDELIVERY) == 1) {
toast = true;
}
return 0;
};
*/

private void _startService()
{     
  timer.scheduleAtFixedRate(   
          new TimerTask() {
                public void run() {

                    try{
                    doServiceWork();
                    Thread.sleep(UPDATE_INTERVAL_FS);

                    }catch(InterruptedException ie){
                        Log.e(getClass().getSimpleName(), "FileScannerService InterruptedException"+ie.toString());
                    }

                }
              },
              DELAY_INTERVAL_FS,
              UPDATE_INTERVAL_FS);

  if(DEBUG)
      Log.d(getClass().getSimpleName(), "FileScannerService Timer started....");
}


private bprReciver mBroadcastReciver;
private Context context = null;
private final IntentFilter intentFilter = new IntentFilter("url.ganzgegeim.BPR_INTENT");

//ID für Notivication 42
private String m_stg = "";
private boolean notifyOn = false;

private String bprText = "TEXT";
private String bprBlog = "";

private void doServiceWork()
{
    //Abfrage ob Netzwerk aktiv
    boolean state = GetNetworkStatus.isNetworkReachable(this, false);
    if(state == false) {
        m_stg = "";
        bprText = "";
        bprBlog = "";
        processStopNotification(true);
        return;
    }

    GetDownload gt = new GetDownload();
    //Blog abholen
    bprBlog = gt.DownloadText(BLOG, true);

    //Banner apbholen
    String str = gt.DownloadText(BANNER, false);

    if(DEBUG)
    Log.d(LOG_TAG, str+ "  " + bprBlog);

    bprText = str;

    if((str.equals(m_stg)) && (str.length() > 3)) {
        return;
    }

    if(str.length() > 3) {
        Intent broadcastIntent = new Intent("url.ganzgegeim.BPR_INTENT");
        broadcastIntent.putExtra("bprStrg", str);
        context.sendBroadcast(broadcastIntent);
    } else {
        processStopNotification(false);
    }

    UpdateDataAndInformReceivers(str);

    m_stg = str;

}

------------ schnipp

Ich vermute das der Fehler in diesem Teil steckt.

Gruß
Jürgen

Antworten
Jürgen
  • Forum-Beiträge: 50

01.08.2014, 15:02:53 via Website

Hallo,

hat wohl doch keiner eine Idee, schade.

Dann frage ich mal anders.
Wann oder unter welchen Umständen kommt denn die Meldung "Leider wurde xxx beendet"
Das generiert doch Android?

Gruß
Jürgen

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.08.2014, 18:01:56 via Website

Ja diese wird von Android generiert wenn die App abstürtzt.
Schau dir am Besten den log im LogCat an da sollte alles nötige drinstehen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jürgen
  • Forum-Beiträge: 50

01.08.2014, 18:43:34 via Website

Das ist ja das Dumme, ich bekomme keinen Log.
Im Simulator passiert es nicht und auf dem Handy oder Tablett habe ich keinen Log.
Oder ich brauch da noch Hilfe weil ich kein android-Profi bin.

Gruß
Jürgen

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

01.08.2014, 19:18:21 via Website

Das Handy gibt auch seinen Log in die LogCat aus, falls du das meinst.

Musst nur das Handy beim Testen angeschlossen lassen.

— geändert am 01.08.2014, 19:18:41

Antworten
Jürgen
  • Forum-Beiträge: 50

01.08.2014, 19:27:04 via Website

Das ich die Entwicklungsumgebung mit dem Handy verbindet habe ich auf Linux noch nie hin bekommen.
Vielleicht liegt es auch daran, dass sich mein Handy dazu nicht eignet, keine Ahnung.

Also müsste ich wohl erst mal alles auf einem Windows Computer installieren. (grausam)

Gruß
Jürgen

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

01.08.2014, 19:31:59 via Website

Hast du den USB Treiber installiert? (falls es die für Linux gibt)

http://developer.android.com/tools/device.html
hier steht was dazu (such einfach nach Linux auf der Seite)

— geändert am 01.08.2014, 19:32:56

Antworten
Jürgen
  • Forum-Beiträge: 50

01.08.2014, 19:38:48 via Website

Danke, schau ich mir an.

Gruß
Jürgen

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.08.2014, 12:09:35 via Website

Zudem müsstest du ein Handy in den Debugmodus bringen, amit du per adb debuggen kannst.
Erst dann ist ein Log möglich.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jürgen
  • Forum-Beiträge: 50

02.08.2014, 14:39:48 via Website

Ja das ist mir schon alles soweit bekannt.
Nur funktuoniert hat es bis jetzt noch nicht.

Noch mal anders gefragt, gibt es eine Möglichkeit diese Meldungen abzuschalten?

Im Grunde interessiert mich das nicht ob mein Service angehalten wurde oder abgestürzt ist denn er wird ja sowieso wieder automatisch gestartet.

Gruß
Jürgen

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.958

02.08.2014, 14:44:00 via App

Jürgen

Ja das ist mir schon alles soweit bekannt.
Nur funktuoniert hat es bis jetzt noch nicht.

Noch mal anders gefragt, gibt es eine Möglichkeit diese Meldungen abzuschalten?

Im Grunde interessiert mich das nicht ob mein Service angehalten wurde oder abgestürzt ist denn er wird ja sowieso wieder automatisch gestartet.

Gruß
Jürgen

Die Aussage, ohwe ...!
Als Entwickler sollte dir das nicht egal sein. Das ist nicht der Weg des Problems.

— geändert am 02.08.2014, 14:45:32

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Jürgen
  • Forum-Beiträge: 50

02.08.2014, 15:00:30 via App

Im Grunde gebe ich Dir da Recht.
Aber da es diese App nicht offensichtlich gibt und es wirklich nicht interessiert ob die App angehalten wurde, sieht es wieder ein wenig anders aus.

Aber stimmt schon ich muss noch mal versuchen zu debuggen.

Gruß
Jürgen

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.08.2014, 16:34:33 via Website

Egal ob der Fehler an anderer stelle (z.b. durch Neustart) wieder "behoben" bzw. aufgehoben wird.
Man sollte sich immer um Fehler kümmern, diese sollten nicht auftreten.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Stefan W
  • Forum-Beiträge: 424

02.08.2014, 18:42:18 via App

Auch wenn es ganz sicher nicht die richtige Vorgehensweise ist, da, wie andere schon geschrieben haben, man vernünftig debuggen sollte. Könntest du mittels try/catch alle Exceptions abfangen.

Antworten
Jürgen
  • Forum-Beiträge: 50

02.08.2014, 23:38:45 via Website

Ok, habe debugging hinbekommen.
Nur schlau werde ich nicht daraus.

08-02 23:30:17.596: W/ActivityThread(11082): Application bla.bla.bla can be debugged on port 8100...
08-02 23:30:17.666: D/Main(11082): tab: 0
08-02 23:30:18.247: D/Main(11082): resumeService
08-02 23:30:18.277: D/FileScannerService(11082): FileScannerService Timer started....
08-02 23:30:18.287: D/FileScannerService(11082): FileService onBind!
08-02 23:30:18.657: D/Main(11082): onServiceConnected
08-02 23:30:19.458: D/FileScannerService(11082): Schrankdienst :-)
08-02 23:30:19.458: D/FileScannerService(11082): FileScannerService UpdateDataAndInformReceivers: Schrankdienst :-)
08-02 23:30:19.598: D/PlayerWidget(11082): PlayerWidget onReceive
08-02 23:30:19.598: D/PlayerWidget(11082): Service update intent received fron fs
08-02 23:30:49.827: D/PlayerService(11082): PlayerService onCreate!
08-02 23:30:49.827: V/MediaPlayer(11082): constructor
08-02 23:30:49.837: V/MediaPlayer(11082): setListener
08-02 23:30:49.847: D/PlayerService(11082): PlayerService onStartCommand
08-02 23:30:49.857: D/AndroidRuntime(11082): Shutting down VM
08-02 23:30:49.857: W/dalvikvm(11082): threadid=1: thread exiting with uncaught exception (group=0x40ddf2a0)
08-02 23:30:49.867: E/AndroidRuntime(11082): FATAL EXCEPTION: main
08-02 23:30:49.867: E/AndroidRuntime(11082): java.lang.RuntimeException: Unable to start service bla.bla.bla.PlayerService@41853068 with null: java.lang.NullPointerException
08-02 23:30:49.867: E/AndroidRuntime(11082): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2553)
08-02 23:30:49.867: E/AndroidRuntime(11082): at android.app.ActivityThread.access$2000(ActivityThread.java:134)
08-02 23:30:49.867: E/AndroidRuntime(11082): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
08-02 23:30:49.867: E/AndroidRuntime(11082): at android.os.Handler.dispatchMessage(Handler.java:99)
08-02 23:30:49.867: E/AndroidRuntime(11082): at android.os.Looper.loop(Looper.java:137)
08-02 23:30:49.867: E/AndroidRuntime(11082): at android.app.ActivityThread.main(ActivityThread.java:4867)
08-02 23:30:49.867: E/AndroidRuntime(11082): at java.lang.reflect.Method.invokeNative(Native Method)
08-02 23:30:49.867: E/AndroidRuntime(11082): at java.lang.reflect.Method.invoke(Method.java:511)
08-02 23:30:49.867: E/AndroidRuntime(11082): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
08-02 23:30:49.867: E/AndroidRuntime(11082): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
08-02 23:30:49.867: E/AndroidRuntime(11082): at dalvik.system.NativeStart.main(Native Method)
08-02 23:30:49.867: E/AndroidRuntime(11082): Caused by: java.lang.NullPointerException
08-02 23:30:49.867: E/AndroidRuntime(11082): at bla.bla.bla.PlayerService.onStartCommand(PlayerService.java:109)
08-02 23:30:49.867: E/AndroidRuntime(11082): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2536)
08-02 23:30:49.867: E/AndroidRuntime(11082): ... 10 more

Gruß
Jürgen

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.08.2014, 23:41:09 via Website

Da ist wohl eine Variable oder so nicht gesetzt, da eine NullPointer Exception.
08-02 23:30:49.867: E/AndroidRuntime(11082): at bla.bla.bla.PlayerService.onStartCommand(PlayerService.java:109)
Was steht denn in PlayerService.java Zeile 109.
Vlt noch ein Bissl mehr code.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jürgen
  • Forum-Beiträge: 50

02.08.2014, 23:51:06 via Website

Erst mal vielen Dank dafür, das Du gewillt bist mir zu helfen.

    @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if(DEBUG) 
        Log.d(LOG_TAG, "PlayerService onStartCommand");

    switch (intent.getFlags())
    {
    case ALARM_START:
        if(DEBUG)
            Log.d(getClass().getSimpleName(), "ALARM_START");
        break;
    case GET_INFO:
        if(DEBUG)
            Log.d(getClass().getSimpleName(), "GET_INFO");
        break;      
    case TOGGLE_STREAMING_STATUS:
        if(DEBUG)
            Log.d(getClass().getSimpleName(), "TOGGLE_STREAMING_STATUS");

        if ( this.playerStatus == STOP )
        {
            try {
                Log.i(getClass().getSimpleName(), "Widget request to start");
                startPlay();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        else if (this.playerStatus == PAUSE)
        {
            try {
                resumePlay();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        else
        {
            stopPlay();
        }           

        break;      

    }
    return 1;
}

Zeile 109 ist der switch switch (intent.getFlags())

Gruß
Jürgen

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.08.2014, 23:54:38 via Website

Dann gibt es vlt. keine Flags.
müsstest du noch überprüfen.
z.b.

  if( intent.getFlags() != null)
{ 
switch (intent.getFlags())

{

..

}

}

Edit: Fehler behoben :)

— geändert am 03.08.2014, 10:30:38

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jürgen
  • Forum-Beiträge: 50

03.08.2014, 00:15:14 via App

werde ich morgen machen.
Vielleicht bringt es ja was.
Danke auf jeden Fall schon mal.

Warum das bei älterer Android Version nicht aufgetreten ist ist mir aber nicht klar.
Evtl ist das ja nicht der einzige Fehler.

Gruß
Jürgen

— geändert am 03.08.2014, 00:15:38

Antworten
Stefan W
  • Forum-Beiträge: 424

03.08.2014, 00:37:29 via App

Was genau steht denn jetzt in der Zeile 109 ?

Antworten
Jürgen
  • Forum-Beiträge: 50

03.08.2014, 01:09:04 via Website

Zeile 109:

switch (intent.getFlags())

Gruß
Jürgen

Antworten
Stefan W
  • Forum-Beiträge: 424

03.08.2014, 07:40:51 via Website

if(intent != null && intent.getFlags() != null)
{
    switch (intent.getFlags())
    {

Antworten
Jürgen
  • Forum-Beiträge: 50

03.08.2014, 14:55:57 via Website

Hallo und Danke noch mal an alle die geholfen haben.
Ich habe mich Stück für Stück durchgekämpft und mit Eurer Hilfe und etwas lesen im Netz bin ich zu folgender Lösung gekommen.

Warum stürzt die App bei neueren Versionen von Android ab und bei alen nicht?
-> Weil die Hardware scheinbar viel mehr ausgelastet ist und dadurch mein Service öffter vom BS gestoppt wird.

Warum kommt es zum Absturz?
-> Weil ich return 1 am Ende der Methode public int onStartCommand(Intent intent, int flags, int startId) verwendet habe
-> Damit wird beim nächsten Start als intent ein Null-Zeiger übergeben :(

Nebenbei:
if (intent.getFlags() != null)
-> bringt mir einen Syntaxfehler, scheinbar geht das so nicht in java

hier nun meine Änderungen (mit Gürtel und Hosenträger)

    @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if(DEBUG) 
        Log.d(LOG_TAG, "PlayerService onStartCommand");

    StringBuilder sb = new StringBuilder();
    sb.append("PlayerService onStartCommand Error: ");
    sb.append(" (");
    sb.append(flags);
    sb.append(") ");

    if (intent != null)
    {
        switch (intent.getFlags())
        {
            case ALARM_START:
                if(DEBUG)
                    Log.d(getClass().getSimpleName(), "ALARM_START");
                break;
            case GET_INFO:
                if(DEBUG)
                    Log.d(getClass().getSimpleName(), "GET_INFO");
                break;      
            case TOGGLE_STREAMING_STATUS:
                if(DEBUG)
                    Log.d(getClass().getSimpleName(), "TOGGLE_STREAMING_STATUS");

                if ( this.playerStatus == STOP )
                {
                    try {
                        Log.i(getClass().getSimpleName(), "Widget request to start");
                        startPlay();
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                else if (this.playerStatus == PAUSE)
                {
                    try {
                        resumePlay();
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                else
                {
                    stopPlay();
                }           
                break;
            default:
                if(DEBUG)
                    Log.d(getClass().getSimpleName(), sb.toString());
        }
    }
    return START_REDELIVER_INTENT;
}   

Gruß
Jürgen

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.08.2014, 15:39:16 via App

Der Syntax Fehler tritt auf weil wahrscheinlich get flags integer als Typ hat

Und einen Integer kann man nicht auf null überprüfen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten