[Android随笔]Android关于Crash的处理

来源:互联网 发布:jquery遍历json对象 编辑:程序博客网 时间:2024/05/16 17:30

一,现象

我们发布的应用,可能会得到用户如下吐槽。我们自己在使用其他手机APP的时候,也会经常想爆粗口。比如:

用户0:卧槽,闪退了,这应用真垃圾。

用户1:MD,什么玩意,这应用打都打不开。

用户2:已经闪退到我的生活不能自理

用户3:一个应用能闪退到这种程度,还敢发布出来,开发商的勇气可谓了得。

等等各种吐槽。

频繁的崩溃会使用户产生负面情绪,衍生的两种用户行都会为App带来极为严重的影响。1,应用市场的差评:对于App来说,差评直接影响排名,间接影响潜在新增用户下载;2,卸载应用:直接影响App用户留存率,间接影响潜在付费用户。

那么遇到这样的问题,我们怎么办呢?一个一个打电话联系客户,咨询详细操作?Impossible。

一个手机APP出现BUG,这是一种正常现象。在遇到这样的Crash问题,首先,我们要保证该应用还能继续使用这是肯定的。然后,尊重每一个客户,给客户一个绝佳的用户体验,比方我们给用户一个很好的反馈提示用户我们的应用还能够为他们服务,并告知用户,我们将及时的处理该问题。一个良好的用户体验,我们得到的,其一是获得种子用户,其二是获得了好的口碑。

既然这样处理可以拥有好的用户体验,我们的应用程序应该实现呢?

二,程序

Android是使用JAVA进行开发,在开发过程中,有些地方在编译时就会报错,需要我们添加try{}catch(Exception e){}捕捉异常,并且处理异常,如下:

public void readDataFromFile(String filePath){        File file = new File(filePath);        try {            FileInputStream fis = new FileInputStream(file);        }catch(FileNotFoundException e){            e.printStackTrace();        }    }

  如上代码,我们在使用IO流时,eclipse或者android studio 之类IDE会提示,需要为new FileInputStream() 添加try catch捕捉异常,因为file文件有可能不存在。我们添加上try catch捕捉FileNotFoundException异常,这样我们的程序就能够编译通过,但是上面的代码还是会存在隐藏性的BUG。比方说,调用该方法,传递的参数是null, 那么我们的应用就出现闪退现象。原因是空指针异常。代码如下:

/** * Created by jiangchangzheng on 7/12/15. */public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        readDataFromFile(null);    }    public void readDataFromFile(String filePath){        File file = new File(filePath);        try {            FileInputStream fis = new FileInputStream(file);        }catch(FileNotFoundException e){            e.printStackTrace();        }    }}

备注:需要在AndroidManifest.xml文件中添加权限,<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> 可访问手机SD卡。

对于这种情况,我们在写程序的时候,因为程序代码很多,可能没有注意到这样的情况。写这类方法,有多种处理方式,好的方式是有良好的编码习惯,对方法传递来的参数进行传入验证。

 public void readDataFromFile(String filePath){ if (filePath == null) { return; }        File file = new File(filePath);        try {            FileInputStream fis = new FileInputStream(file);        }catch(FileNotFoundException e){            e.printStackTrace();        }

如果我们没有做传入参数验证,并且应用已经发布了。则需要依靠系统Crash捕捉异常。

使用UncaughtExceptionHandler来捕捉Crash

我们创建一个BaseApplication继承Application,并将BaseApplication 设为应用Application。

/** * Created by jiangchangzheng on 7/12/15. */public class BaseApplication extends Application{    @Override    public void onCreate() {        super.onCreate();        final Thread.UncaughtExceptionHandler defaultHandler = Thread                .getDefaultUncaughtExceptionHandler();        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {            @Override            public void uncaughtException(Thread thread, Throwable ex) {                ex.printStackTrace();                defaultHandler.uncaughtException(thread, ex);            }        });    }}

AndroidManifest.xml文件中在<Application>中添加属性android.name="cn.com.demo.BaseApplication" 使得BaseApplication作为应用Application。

   <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:name="cn.com.demo.BaseApplication"        android:theme="@style/AppTheme" >        <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application>
详细的使用参考:http://developer.android.com/reference/android/app/Application.html

运行一下程序,我们捕捉到了闪退异常啦。。

   

捕捉到异常后,接下来可以做很多其他是事情啦。其中之一是将错误日志纪录到日志文件中,以便后期反馈到服务端进行分析处理。


0 0
原创粉丝点击