Собственно сабж.
Помогите, люди.
При выходе из приложения кнопкой 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]
LOG CAT что говорит?
Маленькое уточнение.
В эмуляторе ошибку не показывает.
А так вот лог с эмулятора
Лог из эмуля
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
...
и продолжается бой до бесконечности
Ошибка появляется только на таблетке.
Таблетку использовать для тестирования не получается.
Сейчас пробую завести.
А при выходе кликом в определенной программно для выхода области
LOG
03-07 20:47:47.026: D/MainActivity(678): Stopping...
03-07 20:47:47.638: D/MainActivity(678): Destroying...
(в активити соответственно прописаны эти таги
Возможно, оффтоп, но напишу.
При отлове этой ошибки было установлено, что поток еще живет, а вот из приложения уже вышли, так что поток обращается к методу созданного объекта (например, canvas.drawColor(Color.BLACK);), а данного объекта, созданного в классе уже не существует, так что вылезает NullPointerException (как показал дебаг на реальном устройстве). На эмуляторе ошибку не показывает. Следовательно, обворачиваем этот объект в try catch и - вуаля.
try{
canvas.drawColor(Color.BLACK);
}
catch (NullPointerException e) {
//здесь и написать можно что-то про ошибку, или сообщение, что вы покинули игру про Дроидов;).
}Кстати, эта же ошибка вылезала, если переключаться между запущенными приложениями или при нажатии кнопки "Home".
Для начала, все таки нужно знать какая ошибка, а потом исправлять то, что не работает, а не шаманить с бубном над кодом. Снимаешь logcat с устройства (adb -d logcat > error.log) и не дуришь себе мозги. Будешь знать причину - исправишь сам без помощи, тем более, что у тебя тут не исходники gta.
Тема в архиве.