Android Force Closeに発生する異常な原因分析と解決方法
一、原因:
forcecloseは強制的にクローズするという意味で、現在のアプリケーションが衝突しました。
Null PointExection(空のポインター)、IndexOutfBounds Exception(下のオフライン)、Android APIで使用されている順番が間違っていると、setContentView()の前にfindViewById()が行われているなど、一連の異常な捕獲がない可能性があります。
どのように避けるか
Force Closeウィンドウのイジェクトを避けるにはどうすれば、Thread.Uniught Exception HandlerインターフェースのuncahttugException方法コードは以下の通りです。
uncaught Exception方法では、最初のパラメータはスレッドで、二つ目のパラメータは異常です。
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の方法でプロセスを殺します。殺す過程には多くの方法があります。ここで自殺式の方法を挙げます。
以下のように修正します
3,私たちはメインスレッドでこのようにするだけでなく、サブスレッドでも行うことができます。
そしてactivityのライフサイクルでサブスレッドを開き、捕獲異常が発生していないことを傍受します。
子スレッドを書き換えます。子スレッドに異常を設定します。同時にactivityに捕獲された異常なコードと異常なコードを削除することを忘れないでください。
以上は小编が绍介した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の异常な原因分析と解决方法です。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。