Android на резюме пустого экрана

В моем приложении для Android все работает отлично, за исключением того, что когда я нажимаю кнопку "Домой", жду 10-15 минут и возвращаюсь в приложение, экран остается пустым. Я все еще могу получить доступ к пунктам меню, но экран просто черный.

Если я нахожусь на активности в обычном режиме, нажмите кнопку "Домой", затем вернитесь к приложению, все в порядке... его только после того, как он просидел некоторое время...

Есть идеи?

Я помещаю сообщения Toast по пути, когда приложение возобновляет работу, и оно проходит весь путь до последнего выполнения кода. Так что я не знаю, что происходит.

Кроме того, когда экран пуст, нажатие назад или домой вызывает принудительное закрытие

РЕДАКТИРОВАТЬ: Добавление исключения при нажатии кнопки домой:

04-25 15:12:09.625: E/AndroidRuntime(6351): java.lang.RuntimeException: Unable to pause activity {com.MyApp/com.MyAppMain.MainScreen}: java.lang.NullPointerException
04-25 15:12:09.625: E/AndroidRuntime(6351):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2731)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2678)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2651)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at android.app.ActivityThread.access$1700(ActivityThread.java:132)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1045)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at android.os.Looper.loop(Looper.java:150)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at android.app.ActivityThread.main(ActivityThread.java:4263)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at java.lang.reflect.Method.invokeNative(Native Method)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at java.lang.reflect.Method.invoke(Method.java:507)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at dalvik.system.NativeStart.main(Native Method)
04-25 15:12:09.625: E/AndroidRuntime(6351): Caused by: java.lang.NullPointerException
04-25 15:12:09.625: E/AndroidRuntime(6351):     at com.MyAppMain.MainScreen.onPause(MainScreen.java:110)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at android.app.Activity.performPause(Activity.java:3935)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1313)
04-25 15:12:09.625: E/AndroidRuntime(6351):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2708)
04-25 15:12:09.625: E/AndroidRuntime(6351):     ... 12 more




import localytics.localytics.android.LocalyticsSession;

импорт android.app.Activity; импорт android.content.Intent; импорт android.location.Location; импорт android.os.Bundle; импорт android.view.Menu; импорт android.view.MenuInflater; импорт android.view.MenuItem; импорт android.view.View; import android.widget.ImageButton; импорт android.widget.Toast; import com.myapp.R; import com.WhiteLabel.tools.Globals; import com.WhiteLabel.tools.LocationService.LocationResult; import com.WhiteLabel.tools.PreferenceHelper;

открытый класс LoadingScreen расширяет Activity {защищенное местоположение currentLocation; частное приложение ApplicationClass; частный ImageButton btnLocal; частный ImageButton btnNational; частный ImageButton btnDOD; частный ImageButton btnDestination; частная сессия Localytics localyticsSession;

@Override
public void onCreate(Bundle savedInstanceState) 
{
    try
    {           
        //final Activity activity = this;
        application = ApplicationClass.getInstance();       
        setTheme(application.appTheme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loading_screen);

        application.addressSaved = false;

        InitializeControls();

      //  String notifytime = PreferenceHelper.GetNotificationTime(this);

        InitializeLocalytics(true);

        Toast.makeText(this, "Use the menu button to access your account.", Toast.LENGTH_LONG).show();
    }
    catch(Exception ex)
    {           
        String s = ex.toString(); 
    }
}

@Override 
protected void onResume() 
{     
    try
    {       
        super.onResume(); 

        //if(!Globals.isRelease)
            //Toast.makeText(this, "Hit onresume on loading screen.", Toast.LENGTH_LONG).show();

        if(this.localyticsSession!=null)
            this.localyticsSession.open();

        Intent extrasIntent = getIntent();

        if(extrasIntent!=null)
        {           
            Bundle extras = extrasIntent.getExtras();

            if(extras!=null)
            {                               
                String message = extras.getString("load_directive");

                if(message.equalsIgnoreCase("notification"))
                {
                    getIntent().putExtra("load_directive", "");

                    String s = message; 
                    GetDDClick();
                }
            }
        }

        if(!Globals.isRelease)
            Toast.makeText(this, "Hit after extras intent.", Toast.LENGTH_LONG).show();

        //TODO - check for null application obj
        if(application.loadFailed)
        {
            application.loadFailed = false;
            Toast.makeText(getBaseContext(), "Connection issue.  Please verify you are connected to the internet!", Toast.LENGTH_LONG).show();              
        }

        if(!Globals.isRelease)
            Toast.makeText(this, "Hit end of onresume.", Toast.LENGTH_LONG).show();

    }
    catch(Exception ex)
    {
        if(!Globals.isRelease)
            Toast.makeText(this, "onResume error: "+ex.toString(), Toast.LENGTH_LONG).show();
    }
}

public void onPause() 
{  
    try
    {       
        this.localyticsSession.close();     
        this.localyticsSession.upload();     
    }
    catch(Exception ex)
    {
        if(!Globals.isRelease)
            Toast.makeText(this, "onPause error:"+ex.toString(), Toast.LENGTH_LONG).show();
    }       

    super.onPause(); 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) 
{ 
    super.onSaveInstanceState(savedInstanceState); 
    // your stuff or nothing 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) 
{ 
    super.onRestoreInstanceState(savedInstanceState); 
    // your stuff or nothing 
} 

private void InitializeControls()
{
    btnLocal = (ImageButton)findViewById(R.id.btnLocal);
    btnNational = (ImageButton)findViewById(R.id.btnNational);
    btnDOD = (ImageButton)findViewById(R.id.btnDOD);
    btnDestinations = (ImageButton)findViewById(R.id.btnDestinations);

    btnLocal.setOnClickListener(new View.OnClickListener() {  public void onClick(View v) { GetLocalClick();    }});
    btnNational.setOnClickListener(new View.OnClickListener() {  public void onClick(View v) {  GetNationalClick();   }});
    btnDOD.setOnClickListener(new View.OnClickListener() {  public void onClick(View v) {  GetDDClick();   }});
    btnDestinations.setOnClickListener(new View.OnClickListener() {  public void onClick(View v) {  GetDestinationsClick();   }});
}

private void InitializeLocalytics(Boolean instantiate)
{
    if(instantiate)
        this.localyticsSession = new LocalyticsSession(this.getApplicationContext(),Globals.LocalyticsAppKey);         

    this.localyticsSession.open();        // open the session  
    this.localyticsSession.tagScreen("Main Menu");
    this.localyticsSession.upload();      // upload any data 
}

private void GetLocalClick()
{
    application.loadingButtonPressed = "local";
    // set application var to local
    GoToDDView();
}

private void GetNationalClick()
{
    application.loadingButtonPressed = "national";
    application.currentDivision = "national";
    // set application var to national
    GoToDDView();
}

private void GetDDClick()
{
    application.loadingButtonPressed = "daily";
    GoToSelectedView();
}

private void GetDestinationsClick()
{
    application.loadingButtonPressed = "travel";
    GoToDDView();
}

private void GoToDDView()
{
    Intent getResultsWindow = new Intent(LoadingScreen.this, Daily.class);
    startActivity(getResultsWindow);  
}

private void GoToSelectedView()
{
    Intent getResultsWindow = new Intent(LoadingScreen.this, DailySelected.class);
    startActivity(getResultsWindow);  
}

private void GoToHomeServices()
{
    Intent getResultsWindow = new Intent(LoadingScreen.this, MainMenu.class);
    startActivity(getResultsWindow); 
}

private void GoToMyAccount()
{
    Intent configIntent = new Intent(this,MyAccount.class);
    startActivity(configIntent);
}

public boolean onCreateOptionsMenu(Menu menu)
{
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.loadingscreenmenu, menu);
    return true; 
}

public boolean onOptionsItemSelected (MenuItem item)
{
    switch (item.getItemId()) 
    {                   
        case R.id.PROFILE:
            GoToMyAccount();
            return true;
        case R.id.MYVOUCHERS:
            Intent loadVouchersIntent = new Intent(this, Vouchers.class);
            startActivity(loadVouchersIntent);
            return true;
    }

    return false;
}

}

1 ответ

Когда ваше приложение переходит в фоновый режим, оно может быть убито, когда устройству не хватает памяти. Может быть, это часть вашей проблемы.

Вы можете использовать saveInstanceState для сохранения состояния приложения.

Исходя из моего опыта, экран становится черным, когда я пытаюсь добавить трудоемкую синхронную задачу в методе возобновления (это задача, выполняемая в основном потоке операций, а не в фоновом потоке). Если ваш код или процесс относительно длинный в вашем onResume, вы должны заключить его в асинхронный класс, такой как AysncTask или AsyncTask loader. Например, с простым AsyncTask, определенным как анонимный внутренний класс в вашем onResume.

@Override
protected void onResume() {

  new AysncTask<Void,Void,Void>() {

     @Override
     protected String doInBackground(Void... voids) {
         yourTask();
         return;        
     }

  }.execute();

}
Другие вопросы по тегам