AndroidФорумПрограммирование

Ошибка при выходе кнопкой Back или Home

#0
0:36, 8 мар 2014

Собственно сабж.
Помогите, люди.
При выходе из приложения кнопкой back, либо при переключении в другое приложение появляется ошибка В приложении "..." произошла ошибка.

сам MainActivity.Class
кусок

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {

 private static final String TAG = DroidzActivity.class.getSimpleName();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // запрос на отключение строки заголовка 
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // перевод приложения в полноэкранный режим
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        // устанавливаем MainGamePanel как View
        setContentView(new MainGamePanel(this));
        Log.d(TAG, "View added");
    }

 @Override
 protected void onDestroy() {
  Log.d(TAG, "Destroying...");
  super.onDestroy();
 }

 @Override
 protected void onStop() {
  Log.d(TAG, "Stopping...");
  super.onStop();
 }
}


Собственно кусок самого класса, в котором рисуем

public class MainGamePanel extends SurfaceView implements
  SurfaceHolder.Callback {

 private static final String TAG = MainGamePanel.class.getSimpleName();

 private MainThread thread;
 private Droid droid;
 private ElaineAnimated elaine;
 public MainGamePanel(Context context) {
  super(context);

  getHolder().addCallback(this);

  elaine = new ElaineAnimated(
      BitmapFactory.decodeResource(getResources(), R.drawable.walk_elaine)
      , 10, 50  
      , 30, 47  
      , 5, 5);  

  droid = new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.droid_1), 50, 50);

 
  thread = new MainThread(getHolder(), this);


  setFocusable(true);
 }

 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {
 }

 @Override
 public void surfaceCreated(SurfaceHolder holder) {
 
  thread.setRunning(true);
  thread.start();
 }

 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  Log.d(TAG, "Surface is being destroyed");

  boolean retry = true;
  while (retry) {
   try {
    thread.join();
    retry = false;
   } catch (InterruptedException e) {

   }
  }
  Log.d(TAG, "Thread was shut down cleanly");

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  if (event.getAction() == MotionEvent.ACTION_DOWN) {

  droid.handleActionDown((int)event.getX(), (int)event.getY());
   if (event.getY() > getHeight() - 40) {
    thread.setRunning(false);
    ((Activity)getContext()).finish();//а вот здесь выходит из приложения без ошибок!!!! - т.е. если кликаем на определенную область на экране, то выходим из приложения без проблем
   } else {
  }

т.е. кнопкой Back не хотим, а в onTouchEvent(MotionEvent event) выходим спокойно

Помогите, нужно где-то закрыть поток и завершить активность через обработку кнопку Back, или как?

Фот и сам проект, даже собранный apk есть. [file=95325]

#1
0:38, 8 мар 2014

LOG CAT что говорит?

#2
1:05, 8 мар 2014

Маленькое уточнение.
В эмуляторе ошибку не показывает.

А так вот лог с эмулятора
Лог из эмуля
03-07 21:02:15.767: D/MainActivity(761): View added
03-07 21:02:30.836: D/dalvikvm(761): GC_FOR_MALLOC freed 12973 objects / 487712 bytes in 150ms
03-07 21:02:38.056: W/KeyCharacterMap(761): No keyboard for id 0
03-07 21:02:38.056: W/KeyCharacterMap(761): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
03-07 21:02:42.176: D/dalvikvm(761): GC_FOR_MALLOC freed 15060 objects / 532976 bytes in 129ms
03-07 21:02:47.986: D/dalvikvm(761): GC_FOR_MALLOC freed 14880 objects / 524304 bytes in 118ms
03-07 21:02:53.707: D/dalvikvm(761): GC_FOR_MALLOC freed 14881 objects / 524320 bytes in 135ms
03-07 21:02:59.487: D/dalvikvm(761): GC_FOR_MALLOC freed 14884 objects / 524296 bytes in 132ms
03-07 21:03:05.447: D/dalvikvm(761): GC_FOR_MALLOC freed 14923 objects / 524232 bytes in 118ms
...
и продолжается бой до бесконечности

Ошибка появляется только на таблетке.
Таблетку использовать для тестирования не получается.
Сейчас пробую завести.

#3
1:07, 8 мар 2014

А при выходе кликом в определенной программно для выхода области
LOG

03-07 20:47:47.026: D/MainActivity(678): Stopping...
03-07 20:47:47.638: D/MainActivity(678): Destroying...

(в активити соответственно прописаны эти таги

#4
5:45, 8 мар 2014

Возможно, оффтоп, но напишу.
При отлове этой ошибки было установлено, что поток еще живет, а вот из приложения уже вышли, так что поток обращается к методу созданного объекта (например, canvas.drawColor(Color.BLACK);), а данного объекта, созданного в классе уже не существует, так что вылезает NullPointerException (как показал дебаг на реальном устройстве). На эмуляторе ошибку не показывает. Следовательно, обворачиваем этот объект в try catch и - вуаля.

try{
      canvas.drawColor(Color.BLACK);
     }
catch (NullPointerException e) {
    //здесь и написать можно что-то про ошибку, или сообщение, что вы покинули игру про Дроидов;).
     }

Кстати, эта же ошибка вылезала, если переключаться между запущенными приложениями или при нажатии кнопки "Home".

#5
17:47, 9 мар 2014

Для начала, все таки нужно знать какая ошибка, а потом исправлять то, что не работает, а не шаманить с бубном над кодом. Снимаешь logcat с устройства (adb -d logcat > error.log) и не дуришь себе мозги. Будешь знать причину - исправишь сам без помощи, тем более, что у тебя тут не исходники gta.

AndroidФорумПрограммирование

Тема в архиве.