2017-10-03 10 views
-2

アプリがクラッシュしないようにするには、いくつかの例外があります。例外がログやアプリケーションに格納されてクラッシュしないようにしたい。ユーザーに悪い印象を与えるからです。どのように私はこれを達成するのですか?アンドロイドアプリがクラッシュするのを防ぐ方法

+2

私たちは答えますか? –

+2

私たちは皆、アプリケーションがクラッシュしないようにしています。ときには、それを防ぐことが可能な場合もあれば、そうでない場合もあります。しかし、コードなしで...不可能 – Ivan

+0

@イワンありがとう!あなたのコメントのために。しかし、あなたは私が言っていることを得られなかった。 –

答えて

3

この場合、2つのクラスが必要です。貼り付けてください。 このクラスは、アプリケーション内で例外が発生したときに呼び出されます。

public class CrashHandler implements 
     java.lang.Thread.UncaughtExceptionHandler { 
    private final Context myContext; 
    private final String LINE_SEPARATOR = "\n"; 

    public CrashHandler(Context context) { 
     myContext = context; 
    } 

    public void uncaughtException(Thread thread, Throwable exception) { 
     StringWriter stackTrace = new StringWriter(); 
     exception.printStackTrace(new PrintWriter(stackTrace)); 
     StringBuilder errorReport = new StringBuilder(); 
     errorReport.append("************ CAUSE OF ERROR ************\n\n"); 
     errorReport.append(stackTrace.toString()); 

     errorReport.append("\n************ DEVICE INFORMATION ***********\n"); 
     errorReport.append("Brand: "); 
     errorReport.append(Build.BRAND); 
     errorReport.append(LINE_SEPARATOR); 
     errorReport.append("Device: "); 
     errorReport.append(Build.DEVICE); 
     errorReport.append(LINE_SEPARATOR); 
     errorReport.append("Model: "); 
     errorReport.append(Build.MODEL); 
     errorReport.append(LINE_SEPARATOR); 
     errorReport.append("Id: "); 
     errorReport.append(Build.ID); 
     errorReport.append(LINE_SEPARATOR); 
     errorReport.append("Product: "); 
     errorReport.append(Build.PRODUCT); 
     errorReport.append(LINE_SEPARATOR); 
     errorReport.append("\n************ FIRMWARE ************\n"); 
     errorReport.append("SDK: "); 
     errorReport.append(Build.VERSION.SDK); 
     errorReport.append(LINE_SEPARATOR); 
     errorReport.append("Release: "); 
     errorReport.append(Build.VERSION.RELEASE); 
     errorReport.append(LINE_SEPARATOR); 
     errorReport.append("Incremental: "); 
     errorReport.append(Build.VERSION.INCREMENTAL); 
     errorReport.append(LINE_SEPARATOR); 

     Intent intent = new Intent(myContext, ExceptionDisplay.class); 
     intent.putExtra("error", errorReport.toString()); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     myContext.startActivity(intent); 

     android.os.Process.killProcess(android.os.Process.myPid()); 
     System.exit(10); 
    } 

} 

今すぐエラーが表示され活動を行います -

public class ExceptionDisplay extends AppCompatActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.exception_display_layout); 

     TextView exception_text = (TextView) findViewById(R.id.exception_text); 
     Button btnBack = (Button) findViewById(R.id.btnBack); 
     exception_text.setText(getIntent().getExtras().getString("error")); 

     btnBack.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       intentData(); 
      } 
     }); 
    } 

    @Override 
    public void onBackPressed() { 
     intentData(); 
    } 

    public void intentData() { 

     Log.d("CDA", "onBackPressed Called"); 
     Intent setIntent = new Intent(ExceptionDisplay.this, AppDataSourceSelection.class); 
     setIntent.addCategory(Intent.CATEGORY_HOME); 
     setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(setIntent); 
    } 
} 

今、あなたは、アプリケーションのクラスを拡張するクラスで、このクラスを呼び出すことができますどのようにすることができますコードとlogcatなければ

public class ErrorHandler extends Application { 


    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Thread.setDefaultUncaughtExceptionHandler(new CrashHandler(getApplicationContext())); 

     }} 
+0

@Champandroidありがとう(Y) –

+0

ようこそ@Asad – Champandorid

1

try catchブロックを使用すると、アプリケーションがクラッシュするのを防ぐことができます。 catchブロックでは、予想される例外を取得し、あなたの助けにそれを記録します。 しかし、すべての例外がキャッチされるわけではないことを覚えておいてください。 いくつかの例外はExceptionから派生しないためです。 Throwableとエラー。

は、基本的には型の階層は次のとおりです。あなたがThrowableをキャッチした場合、本当にすべてをキャッチするように

Object 
    | 
    Throwable 
/  \ 
Exception Error 

のみのスロー可能オブジェクトと派生クラスは、スローすることができます。

RuntimeExceptionから派生したもの以外のException(またはException自体)から派生した例外は、例外をスローすると宣言する必要があります。

すべては、あなたがこれでキャッチされない例外を自分で処理することができます... Java例外階層は混乱のビットです、

1

に語りました。 以下のコードをアプリケーションクラスに使用します。

public class MyApplication extends Application { 
    private UncaughtExceptionHandler defaultUEH; 

    private Thread.UncaughtExceptionHandler _unCaughtExceptionHandler = 
     new Thread.UncaughtExceptionHandler() { 
      @Override 
      public void uncaughtException(Thread thread, Throwable ex) { 

       // here I do logging of exception to a db 
       Log.d("MyApp", "Uncaught exception.");  
       // Do what you want. 

       // re-throw exception to O.S. if that is serious and need to be handled by o.s. Uncomment the next line that time. 
      //defaultUEH.uncaughtException(thread, ex); 
      } 
     }; 

    public MyApplication() { 
     defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); 

     // setup Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler); 
    } 
} 
関連する問題