Android Force Closeに発生する異常な原因分析と解決方法


一、原因:
forcecloseは強制的にクローズするという意味で、現在のアプリケーションが衝突しました。
Null PointExection(空のポインター)、IndexOutfBounds Exception(下のオフライン)、Android APIで使用されている順番が間違っていると、setContentView()の前にfindViewById()が行われているなど、一連の異常な捕獲がない可能性があります。
どのように避けるか
Force Closeウィンドウのイジェクトを避けるにはどうすれば、Thread.Uniught Exception HandlerインターフェースのuncahttugException方法コードは以下の通りです。

public class MainActivity extends Activity implements Thread.UncaughtExceptionHandler,
View.OnClickListener {
private List<String> mList = new ArrayList<String>();
private Button btn;
private int pid;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("tag", "--->>onCreate");
initView();
//       handler
Thread.setDefaultUncaughtExceptionHandler(this);
}
/**
*      
*/
private void initView() {
btn = (Button) findViewById(R.id.main_btn);
btn.setOnClickListener(this);
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "   forceclose,     :" + "
" + arg1.toString()+" Thread:"+arg0.getId()); // finish();// activity android.os.Process.killProcess(android.os.Process.myPid()); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub switch (arg0.getId()) { case R.id.main_btn: mList.get(1) ;// break; default: break; } } @Override protected void onPause() { super.onPause(); Log.i("tag", "--》onpause"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.i("tag", "--->onstop"); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.i("tag", "-->ondestroy"); } }
また、どのスレッドがほしいですか?捕獲されていない異常を処理できます。Thread.set Default Uncaugt Exception Handler(this)。このコードは全部そのスレッドの中で一回実行します。
uncaught Exception方法では、最初のパラメータはスレッドで、二つ目のパラメータは異常です。

public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "   forceclose,     :" + "
" + arg1.toString()+" Thread:"+arg0.getId()); // finish();// activity android.os.Process.killProcess(android.os.Process.myPid()); }
次に、ログログログの結果を見ます。
08-0918:50:27.7410739-10739/example.com.force_ANrI->onCreate
08-918:50:31.6410739-10739/example.com.force_anrI/tag/截得到forceclose,異常原因:
java.lang.IndexOutOfBounds Exception:Invalidindex 1、sizis 0 Thread:1
異常な捕獲に成功し、activityも終了しましたが、安全に終了したわけではありません。もう一度クリックしてappkを開いたら、プログラムが応答しません。
上記の問題を解決するために、私はuncaght Exceptionの方法でプロセスを殺します。殺す過程には多くの方法があります。ここで自殺式の方法を挙げます。
以下のように修正します

@Override 
public void uncaughtException(Thread arg0, Throwable arg1) { 
// TODO Auto-generated method stub 
Log.i("tag", "   forceclose,     :" + "
" + arg1.toString()); android.os.Process.killProcess(android.os.Process.myPid()); // }
他のプログラムは変わりません。
3,私たちはメインスレッドでこのようにするだけでなく、サブスレッドでも行うことができます。
そしてactivityのライフサイクルでサブスレッドを開き、捕獲異常が発生していないことを傍受します。

class MyRunnable extends Thread implements Thread.UncaughtExceptionHandler {
@Override
public void run() {
// TODO Auto-generated method stub
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "childThread:   forceclose,     :" + "
" + arg1.toString()+" Thread->"+arg0.getId()+" id->"+Thread.currentThread().getId()+" "+ Thread.currentThread().getName()); android.os.Process.killProcess(android.os.Process.myPid()); } }
ここに問題があります。私たちは明らかにサブスレッドで捕獲された異常なのに、なぜスレッドがメインスレッドなのですか?以下でこの問題を検討します。

08-09 19:02:47.734 14483-14483/example.com.force_anr I/tag: --->>onCreate
08-09 19:02:51.304 14483-14483/example.com.force_anr I/tag: childThread:   forceclose,     :
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 Thread->1    id->1 main 
4.第三ステップの問題を解決する
子スレッドを書き換えます。子スレッドに異常を設定します。同時にactivityに捕獲された異常なコードと異常なコードを削除することを忘れないでください。

class MyRunnable extends Thread implements Thread.UncaughtExceptionHandler {
int a[];
@Override
public void run() {
// TODO Auto-generated method stub
Thread.setDefaultUncaughtExceptionHandler(this);
int i = a[0];//  
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
Log.i("tag", "childThread:   forceclose,     :" + "
" + arg1.toString()+" Thread->"+arg0.getId()+" id->"+Thread.currentThread().getId()+" "+ Thread.currentThread().getName()); android.os.Process.killProcess(android.os.Process.myPid()); } }
起動時に以下のロゴが表示されます。

08-09 19:08:20.124 16308-16308/example.com.force_anr I/tag: --->>onCreate
08-09 19:08:20.124 16308-16341/example.com.force_anr I/tag: childThread:   forceclose,     :
java.lang.NullPointerException: Attempt to read from null array Thread->44829    id->44829 Thread-44829
08-09 19:08:20.254 16349-16349/example.com.force_anr I/tag: --->>onCreate
08-09 19:08:20.354 16376-16376/example.com.force_anr I/tag: --->>onCreate
08-09 19:08:20.354 16376-16411/example.com.force_anr I/tag: childThread:   forceclose,     :
java.lang.NullPointerException: Attempt to read from null array Thread->44839    id->44839 Thread-44839 
試しに二回起動したようです。Threadはもう変わっています。この方法でuncaught Exception(Thread arg 0、Throwable arg 1)のarg 0とは、異常が発生したそのThreadを指し、uncaught Exceptionに登録されたThreadとは限らない。
以上は小编が绍介したAndroid Force Closeの异常な原因分析と解决方法です。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。