如何防止我的android应用程序强制关闭?

问题描述:

在我的应用程序的用户界面中有四个按钮,其中三个按钮(当单击时)从mysql db中检索图像并将其显示在android手机中。第四个按钮的工作是从数据库中检索文本。如何防止我的android应用程序强制关闭?

如果有任何检索图像的按钮先被点击,图像将被显示。然后如果点击检索图像的按钮,则会显示文本。

但是,当点击显示图像的任何按钮之前首先单击检索文本的按钮时,应用程序强制关闭!

检索文本如下

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 [email protected] 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 [email protected] 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 [email protected] 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 [email protected] 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(); 

        } 
      }); 
+0

你可以请发布stacktrace? – BigFwoosh 2011-06-06 19:04:28

+0

就像BigFwosh说的那样,我们需要一个堆栈轨迹来了解从哪里开始。这可能是因为它无法从你的数据库中读取,可能是因为任何原因你的方法中的任何对象都是空的。 – CaseyB 2011-06-06 19:15:03

+0

logcat中有很多条目..我怎么知道要发布哪一个? – Shalini 2011-06-06 19:29:21

M表示的按钮的onclick活性的代码你的感觉是一个空指针错误。我要做的是将整个方法放在一个大的try{} catch (Throwable t) {}区块中。

然后打印出堆栈跟踪和错误消息。事情是,你将不得不调试步骤的代码,因为System.out.println()在android中没有太大的作用。

(旁白:在Android中,我已经习惯了使用Log.v()或一次性调试代码,其中在其他平台上你可以使用系统输出类似的东西)

或者你可以尝试android的日志框架与类似的东西:

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

然后,您可以搜索您的logcat下载单词“Ric_TEST”。或者(假设您使用Eclipse),您可以通过输入标记文本来过滤logcat输出。

另一种类似的方法是使用adb(adb logcat -v time)连接到您的设备,并且您可以观看日志,并在应用程序崩溃时查看堆栈跟踪。

请注意:一旦发现错误,请删除我提到的try..catch块 - 我只是将它作为一种工具来发现错误。