как предотвратить принудительное закрытие моего приложения для Android?

#android

#Android

Вопрос:

В пользовательском интерфейсе моего приложения есть четыре кнопки, из которых три кнопки (при нажатии) извлекают изображение из базы данных mysql и отображают его в телефоне Android. задача четвертой кнопки — извлекать текст из базы данных.

если сначала нажать на какую-либо из кнопок, извлекающих изображение, отображается изображение.и затем, если нажать на кнопку, которая извлекает изображение, отображается текст.

Но когда сначала нажимается кнопка, которая извлекает текст, даже до нажатия любой кнопки, отображающей изображение, приложение принудительно закрывается!!

код для действия onClick кнопки, которая извлекает текст, выглядит следующим образом

 b.setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {        
            Toast.LENGTH_SHORT).show();

            try {
                data.put("id",id);
            } catch (JSONException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } 
            String url="http://10.0.2.2:8080/finder/review/listA";

            try { 
                img.setImageBitmap(null);
                json =HTTPPoster.doPost(url, data);

                Toast.makeText(getBaseContext(),json.toString(),     Toast.LENGTH_SHORT).show();
                 titles=json.getJSONObject("titles");
                 Toast.makeText(getBaseContext(),    titles.toString(), Toast.LENGTH_SHORT).show();
                 msgs=json.getJSONObject("msgs");
                 names=json.getJSONObject("names");

            String one=titles.getString("0");
            Toast.makeText(getBaseContext(), one.toString(),Toast.LENGTH_LONG).show();
            t.setText("nReviews n");
            String content="";


            for(int i=0;i<3;i  )
            {
                String msg=msgs.getString(i "");
                 name=names.getString(i "");
                String title=titles.getString(i "");

                content=t.getText() ("n Name" name "n Title: " title "n Msg:" msg);
                t.setText(content);

                Toast.makeText(getBaseContext(),"Name:" name "n Title: " title "n Message" msg,Toast.LENGTH_SHORT).show(); 
            }

                // t.setText()
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
  

logcat

 06-07 00:25:29.923: INFO/Process(234): Sending signal. PID: 234 SIG: 9
06-07 00:25:30.042: INFO/WindowManager(58): WIN DEATH: Window{44e66ef0 com.lpss/com.lpss.MyList paused=false}
06-07 00:25:30.053: INFO/WindowManager(58): WIN DEATH: Window{44d72da0 com.lpss/com.lpss.lpss paused=false}
06-07 00:25:30.053: INFO/ActivityManager(58): Process com.lpss (pid 234) has died.
06-07 00:25:30.062: WARN/GpsLocationProvider(58): Unneeded remove listener for uid 1000
06-07 00:25:30.062: DEBUG/GpsLocationProvider(58): stopNavigating
06-07 00:25:30.062: INFO/WindowManager(58): WIN DEATH: Window{44dedb10 Toast paused=false}
06-07 00:25:30.091: WARN/ActivityManager(58): Scheduling restart of crashed service com.lpss/.NotifyService in 5000ms
06-07 00:25:30.103: INFO/WindowManager(58): WIN DEATH: Window{44dd9490 com.lpss/com.lpss.Contents paused=false}
06-07 00:25:30.244: INFO/ActivityManager(58): Start proc com.lpss for activity com.lpss/.MyList: pid=248 uid=10030 gids={3003, 1015}
06-07 00:25:30.244: ERROR/ActivityThread(58): Failed to find provider info for android.server.checkin
06-07 00:25:30.244: WARN/Checkin(58): Can't log event SYSTEM_SERVICE_LOOPING: java.lang.IllegalArgumentException: Unknown URL content://android.server.checkin/events
06-07 00:25:30.743: DEBUG/ddm-heap(248): Got feature list request
06-07 00:25:30.912: INFO/UsageStats(58): Unexpected resume of com.lpss while already resumed in com.lpss
06-07 00:25:31.443: WARN/InputManagerService(58): Got RemoteException sending setActive(false) notification to pid 234 uid 10030
06-07 00:25:31.603: INFO/ActivityManager(58): Displayed activity com.lpss/.MyList: 1487 ms (total 1487 ms)
06-07 00:25:31.713: WARN/NotificationService(58): Object died trying to hide notification android.app.ITransientNotification$Stub$Proxy@44de2548 in package com.lpss
06-07 00:25:31.713: WARN/ActivityManager(58): setProcessForeground called on unknown pid: 234
06-07 00:25:31.723: WARN/NotificationService(58): Object died trying to show notification android.app.ITransientNotification$Stub$Proxy@44de2c70 in package com.lpss
06-07 00:25:31.723: WARN/ActivityManager(58): setProcessForeground called on unknown pid: 234
06-07 00:25:31.723: WARN/NotificationService(58): Object died trying to show notification android.app.ITransientNotification$Stub$Proxy@44dd78a0 in package com.lpss
06-07 00:25:31.723: WARN/ActivityManager(58): setProcessForeground called on unknown pid: 234
06-07 00:25:31.723: WARN/NotificationService(58): Object died trying to show notification android.app.ITransientNotification$Stub$Proxy@44dd7fc8 in package com.lpss
06-07 00:25:31.723: WARN/ActivityManager(58): setProcessForeground called on unknown pid: 234
06-07 00:41:25.262: DEBUG/dalvikvm(58): GC freed 19490 objects / 957584 bytes in 209ms
  

код, который извлекает изображение

 b3.setOnClickListener(new OnClickListener() {

                    public void onClick(View arg0) {

                        try {
                            data.put("name",name);
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        String url="http://10.0.2.2:8080/finder/place/ph?id=" id;
                        //      json =HTTPPoster.doPost(url, data);
                        downloadImage(url);
//      Toast.makeText(this,json.toString() , Toast.LENGTH_SHORT).show();

                    }
             });
             b4.setOnClickListener(new OnClickListener() {

                    public void onClick(View arg0) {
                        t.setText("");
                        try {
                            data.put("name",name);
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        String url="http://10.0.2.2:8080/finder/place/map?id=" id;
                        //      json =HTTPPoster.doPost(url, data);
                        downloadImage(url);
//      Toast.makeText(this,json.toString() , Toast.LENGTH_SHORT).show();

                    }
             });
  

Комментарии:

1. Не могли бы вы опубликовать трассировку стека?

2. Как говорит BigFwosh, нам понадобится трек стека, чтобы иметь представление, с чего начать. Возможно, ему не удалось выполнить чтение из вашей базы данных, возможно, любой из объектов в вашем methed по какой-либо причине равен null.

3. в logcat много записей .. как мне узнать, какую из них опубликовать?

4. Похоже, что stacktrace не имеет отношения к вашему коду. Если вы снова вызовете сбой, вы можете получить новый logcat, и ваше исключение будет последним в списке.

Ответ №1:

По моему ощущению, это ошибка нулевого указателя. Что я бы сделал, так это заключил весь метод в большой try{} catch (Throwable t) {} блок.

Затем распечатайте трассировку стека и сообщение об ошибке. Дело в том, что вам пришлось бы выполнять отладку кода, поскольку System.out.println() мало что делает в Android.

(в стороне: в Android я привык использовать Log.v () или что-то подобное для одноразового отладочного кода, где на других платформах вы бы использовали sysout)

Или вы могли бы попробовать android logging framework с чем-то вроде:

 catch (Throwable t)
{
    Log.v("Ric_TEST", t.getMessage();
}
  

Затем вы можете выполнить поиск в загруженном logcat файле по слову «Ric_TEST». В качестве альтернативы (при условии, что вы используете Eclipse) вы можете отфильтровать выходные данные logcat, введя текст тега.

Другим подобным способом является подключение к вашему устройству с помощью adb (adb logcat -v time), и вы можете просмотреть журнал и увидеть трассировку стека при сбое приложения.

Пожалуйста, обратите внимание: как только вы обнаружите неисправность, удалите блок try .. catch, о котором я упоминал — я защищаю его только как инструмент для поиска неисправности.