Приложение Android работает только один раз, затем вылетает - PullRequest
0 голосов
/ 11 марта 2012

Хорошо, у меня возникли проблемы с работой приложения. В основном у меня есть игра, которая должна получить несколько картинок и строк от пользователя. У меня есть начальный экран (OpeningScreen), который действует как заставка, которая открывает меню (MenuScreen). Оттуда пользователь может выбрать, чтобы перейти в игру или перейти к активности, которая показывает текущие изображения (PickScreen). Пользователь может перейти к этому действию и оттуда открыть другое действие, которое дает увеличенную версию изображения, которое он выбрал в данный момент, или изображение по умолчанию (PicOne). Здесь у пользователя есть возможность сделать новый снимок и изменить текущие строки. По большей части все это прекрасно работает. Моя проблема возникает, когда:

После того, как пользователь выберет картинку и выйдет из приложения. В следующий раз, когда они откроют его, оно принудительно закроется, когда я вернусь к PickScreen или после нажатия кнопки «Готово» после создания нового снимка, а иногда и при переходе к операции PicOne. Он не делает то же самое каждый раз, он просто падает в одной из этих точек.

Другая проблема возникает, когда я меняю 3 строковых имени. После нажатия кнопки «Сохранить» и возврата к PickScreen приложение вылетает при возврате в PicOne или происходит сбой при выходе из приложения при переходе с MenuScreen на PickScreen.

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

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

Спасибо всем !!

Класс PicOne

public class PicOne extends Activity implements OnClickListener {
ImageView iv;
EditText c1, c2, c3;
Button cam, save;
Bitmap bit, bmp,other;
Intent i;
Uri uriSavedImage;
String imageFilePath10 = "", name1="", name2="", name3="";
final static int cameraData = 0; 
boolean CAMERA;
int camORgal10 = 0;
SharedPreferences gameData;

    @Override
    protected void onCreate(Bundle savedInstanceState)  {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.picone);
        CAMERA = false;
        iv = (ImageView)findViewById(R.id.picIV);
        cam = (Button)findViewById(R.id.camButton);
        save = (Button)findViewById(R.id.savebut);
        e1 = (EditText)findViewById(R.id.Enter1);
        e2 = (EditText)findViewById(R.id.Enter2);
        e3 = (EditText)findViewById(R.id.Enter3);

        cam.setOnClickListener(this);
        save.setOnClickListener(this);
}
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch(v.getId())
        {
        //camera
        case R.id.camButton:
            camORgal10 = 1;
            i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);               
            File imagesFolder = new File(Environment.getExternalStorageDirectory(), "MySpot"); 
            imagesFolder.mkdirs(); // <---- 
            String fileName = "image_1.PNG"; 
            File output = new File(imagesFolder, fileName);             
            uriSavedImage = Uri.fromFile(output);         
            i.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
            i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivityForResult(i, cameraData);
            break;

        case R.id.savebut:
            CAMERA = true;
            name1 = e1.getText().toString();
            name2 = e2.getText().toString();
            name3 = e3.getText().toString();
            SharedPreferences.Editor editor = gameData.edit();
            editor.putInt("NUM10CAMGAL", camORgal10);
            editor.putString("NUM10NAME1", name1);
            editor.putString("NUM10NAME2", name2);
            editor.putString("NUM10NAME3", name3);
            editor.commit();
            Intent goPT = new Intent(this, PickScreen.class);
            goPT.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            goPT.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            finish();
            startActivity(goPT);                
            break;

        }
    }

    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        if(keyCode == KeyEvent.KEYCODE_BACK)
        {
            CAMERA = true;
            name1 = e1.getText().toString();
            name2 = e2.getText().toString();
            name3 = e3.getText().toString();
            SharedPreferences.Editor editor = gameData.edit();
            editor.putInt("NUM10CAMGAL", camORgal10);
            editor.putString("NUM10NAME1", name1);
            editor.putString("NUM10NAME2", name2);
            editor.putString("NUM10NAME3", name3);
            editor.commit();
            Intent goPT = new Intent(this, PickScreen.class);
            goPT.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            goPT.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            finish();
            startActivity(goPT);

            return true;
        }
        return super.onKeyDown(keyCode, event);
    }   

    @Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == cameraData)     
        {         
            if(resultCode == RESULT_OK && data.hasExtra("data"))         
            {             
                    bmp = (Bitmap) data.getExtras().get("data");
                    iv.setImageBitmap(bmp); 



            }         
            else if (resultCode == RESULT_CANCELED)        
            {            
                Toast.makeText(getApplicationContext(), "Cancelled",Toast.LENGTH_SHORT).show();    
            }      
        }


      }



    @Override
    protected void onPause() {
        // TODO Auto-generated method stub

        super.onPause();

    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub


        if(OpeningScreen.isEXIT)
        {
            finish();
        }
        gameData = getSharedPreferences(MenuScreen.MYFOLDER, 0);
        name1 = slotData.getString("NUM10NAME1", "one");
        name2 = slotData.getString("NUM10NAME2", "two");
        name3 = slotData.getString("NUM10NAME3", "three");
        e1.setText(name1);
        e2.setText(name2);
        e3.setText(name3);
        camORgal10 = gameData.getInt("NUM10CAMGAL", 0);
        if(camORgal10 == 0)
        {
            bit = BitmapFactory.decodeResource(getResources(), R.drawable.red);
        }
        else if(camORgal10 == 1)
        {
            File imgFile = new File(Environment.getExternalStorageDirectory() + "/MySpot/image_1.PNG");
            if(imgFile.exists())
            {
               bit = BitmapFactory.decodeFile(imgFile.getAbsolutePath());   
            }
            else
            {
                bit = BitmapFactory.decodeResource(getResources(), R.drawable.red);
            }
        }

        else
        {
            bit = BitmapFactory.decodeResource(getResources(), R.drawable.red);
        }           
        iv.setImageBitmap(bit);
        super.onResume();
    }
}

OpeningScreen

public class OpeningScreen extends Activity {
/** Called when the activity is first created. */
 public static boolean isEXIT = false;

@Override   
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    isEXIT = false;
    Thread timer = new Thread(){
        public void run(){
            try{
                sleep(2500);
            } catch(InterruptedException e){

            } finally{
                Intent toMenu = new Intent(getApplicationContext(), MenuScreen.class);
                toMenu.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                //toMenu.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                finish();
                startActivity(toMenu);                  
            }               
        }
    };
    timer.start();
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    finish();
    super.onPause();        
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    if(isEXIT)
    {
        finish();
    }

    super.onResume();
}    
}

MenuScreen

public class MenuScreen extends Activity implements OnClickListener {
float x,y;
int camORgal = 0;
ImageButton play, edit, more;
Intent i;
public static String MYFOLDER = "GAMEDATA";
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.menu);
    play = (ImageButton)findViewById(R.id.IBplay);
    edit = (ImageButton)findViewById(R.id.IBedit);
    more = (ImageButton)findViewById(R.id.IBmore);
    play.setOnClickListener(this);
    edit.setOnClickListener(this);
    more.setOnClickListener(this);
}

public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        OpeningScreen.isEXIT = true;
        finish();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

public void onClick(View v) {
    // TODO Auto-generated method stub
    switch(v.getId())
    {
    case R.id.IBplay:
        i = new Intent(getApplicationContext(), TheGame.class);
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        finish();
        startActivity(i);           
        break;
    case R.id.IBedit:
        i = new Intent(this, PickScreen.class);
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        finish();
        startActivity(i);           
        break;
    case R.id.IBmore:

        break;
    }
}

}

PickScreen

public class PickScreen extends Activity implements OnClickListener {
Button bPic1, bPic2, bPic3;
ImageView ivpic3,ivpic2, ivpic1;
TextView TVpic3a, TVpic3b, TVpic3c, TVpic2a, TVpic2b, TVpic2c, TVpic1a, TVpic1b, TVpic1c;
Intent pageMove;
SharedPreferences gameData;
int camORgal10 = 0;
String threeNamea = "", threeNameb = "", threeNamec = "", twoNamea = "", twoNameb = "", twoNamec = "", oneNamea = "", oneNameb = "", oneNamec = "";

Bitmap bmp1, bmp2,bmp3;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.paytable);
                intitializeThings();        
}


public void intitializeThings()
{
    bPic1 = (Button)findViewById(R.id.pic1but);
    bPic2 = (Button)findViewById(R.id.pic2but);
    bPic3 = (Button)findViewById(R.id.pic3but);
    ivpic3 = (ImageView)findViewById(R.id.ivpic3a);
    ivpic2 = (ImageView)findViewById(R.id.ivpic2a);
    ivpic1 = (ImageView)findViewById(R.id.ivpic1a);
    TVpic3a = (TextView)findViewById(R.id.pic3TVa);
    TVpic3b = (TextView)findViewById(R.id.pic3TVb);
    TVpic3c = (TextView)findViewById(R.id.pic3TVc);
    TVpic2a = (TextView)findViewById(R.id.pic2TVa);
    TVpic2b = (TextView)findViewById(R.id.pic2TVb);
    TVpic2c = (TextView)findViewById(R.id.pic2TVc);
    TVpic1a = (TextView)findViewById(R.id.pic1TVa);
    TVpic1b = (TextView)findViewById(R.id.pic1TVb);
    TVpic1c = (TextView)findViewById(R.id.pic1TVc);


    bPic1.setOnClickListener(this);
    bPic2.setOnClickListener(this);
    bPic3.setOnClickListener(this);
}

public void onClick(View v) {
    // TODO Auto-generated method stub
    switch(v.getId())
    {
    case R.id.pic1but:
        pageMove = new Intent(getApplicationContext(), PicOne.class);
        pageMove.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        pageMove.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        //pageMove.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        finish();
        startActivity(pageMove);

        break;
    case R.id.pic2but:
        pageMove = new Intent(getApplicationContext(), PicTwo.class);
        pageMove.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        //pageMove.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        startActivity(pageMove);
        finish();
                          break;
    case R.id.pic3but:
        pageMove = new Intent(getApplicationContext(), PicThree.class);
        pageMove.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        //pageMove.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        startActivity(pageMove);
        finish();   
                          break;            
    }
}

public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        Intent goOP = new Intent(this, MenuScreen.class);
        goOP.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        goOP.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        finish();
        startActivity(goOP);

        return true;
    }
    return super.onKeyDown(keyCode, event);
}


@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();

}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();   


        gameData = getSharedPreferences(MenuScreen.MYFOLDER, 0);
        oneNamea = gameData.getString("NUM10NAME1", "one");
        oneNameb = gameData.getString("NUM10NAME2", "two");
        oneNamec = gameData.getString("NUM10NAME3", "three");
        camORgal10 = gameData.getInt("NUM10CAMGAL", 0);


        if(camORgal10 == 1)
        {
            File pic1 = new File(Environment.getExternalStorageDirectory() + "/MySpot/image_1.PNG");
            if(pic1.exists())
            {
                bmp1 = BitmapFactory.decodeFile(pic1.getAbsolutePath());
            }
            else
            {
                bmp1 = BitmapFactory.decodeResource(getResources(), R.drawable.red);
            }
        }

        else if(camORgal10 == 0)
        {
            bmp1 = BitmapFactory.decodeResource(getResources(), R.drawable.red);
        }
        else
        {
            bmp1 = BitmapFactory.decodeResource(getResources(), R.drawable.red);
        }


        File pic2 = new File(Environment.getExternalStorageDirectory() + "/MySpot/image_2.PNG");
        File pic3 = new File(Environment.getExternalStorageDirectory() + "/MySpot/image_3.PNG");


        if(pic2.exists())
        {
            bmp2 = BitmapFactory.decodeFile(pic2.getAbsolutePath());
        }
        else
        {
            bmp2 = BitmapFactory.decodeResource(getResources(), R.drawable.purple);
        }
        if(pic3.exists())
        {
            bmp3 = BitmapFactory.decodeFile(pic3.getAbsolutePath());
        }
        else
        {
            bmp3 = BitmapFactory.decodeResource(getResources(), R.drawable.green);
        }


        ivpic3.setImageBitmap(bmp3);

        ivpic2.setImageBitmap(bmp2);

        ivpic1.setImageBitmap(bmp1);

        TVpic1a.setText(oneNamea);
        TVpic1b.setText(oneNameb);
        TVpic1c.setText(oneNamec);

}


} 

Ответы [ 2 ]

1 голос
/ 11 марта 2012

Logcat даст вам трассировку стека, а затем с помощью отладки определит место, где происходит сбой. Отладка современного приложения путем чтения кода, особенно кода ООП, практически невозможна.

0 голосов
/ 10 июля 2013

Вероятно, это связано с тем, что AOS не закрывает приложения, но вы можете подумать, что это так.Таким образом, при следующем запуске AOS не запускает ваше приложение «с нуля», но вызывает ваше кэшированное приложение.И поскольку ваша логика не ожидала, что ваше приложение зависнет.Я почти уверен, что все начинается снова, сразу после сбоя, но при следующем запуске снова происходит сбой -> цикл.Поэтому, чтобы избежать этого, используйте System.exit (0) (большинство продвинутых разработчиков скажут, что это плохая практика), чтобы убедиться, что ваше приложение не станет зомби ИЛИ не изменит логику вашего приложения, чтобы оно не зависало при следующем запуске, потому что основное действиевсе еще там.

...