質問: asynctaskとエラー処理android コードをhandlerからasynctaskに変換しています。後者は、メインuiスレッドでの非同期の更新と結果の処理が優れています。私にとって不明確なのは、asynctask#doinbackgroundで何かがうまくいかない場合に例外を処理する方法です。私がやる方法は、エラーハンドラを用意して、それにメッセージを送信することです。それはうまくいきますが、それは「正しい」アプローチですか、それともより良い代替手段がありますか?また、エラーハンドラをアクティビティフィールドとして定義すると、uiスレッドで実行される必要があることも理解しています。ただし、handler#handlemessageからトリガーされたコードが間違ったスレッドで実行されているという例外を受け取ることがあります(非常に予測不可能です)。代わりにactivity#oncreateでエラーハンドラーを初期化する必要がありますか? runonuithreadをhandler#handlemessageに配置することは冗長に思えますが、非常に確実に実行されます。
回答: 成功と失敗のコールバックを定義するインターフェイスを持つ独自のasynctaskサブクラスを作成しました。したがって、asynctaskで例外がスローされると、onfailure関数に例外が渡されます。そうでない場合、onsuccessコールバックに結果が渡されます。なぜandroidにはもっと良いものがないのは私を超えています。public class safeasynctask<inbackgroundtype, progresstype, resulttype> extends asynctask<inbackgroundtype, progresstype, resulttype> { protected exception cancelledforex = null; protected safeasynctaskinterface callbackinterface; public interface safeasynctaskinterface <cbinbackgroundtype, cbresulttype> { public object backgroundtask(cbinbackgroundtype[] params) throws exception; public void oncancel(cbresulttype result); public void onfailure(exception ex); public void onsuccess(cbresulttype result); } @override protected void onpreexecute() { this.callbackinterface = (safeasynctaskinterface) this; } @override protected resulttype doinbackground(inbackgroundtype... params) { try { return (resulttype) this.callbackinterface.backgroundtask(params); } catch (exception ex) { this.cancelledforex = ex; this.cancel(false); return null; } } @override protected void oncancelled(resulttype result) { if(this.cancelledforex != null) { this.callbackinterface.onfailure(this.cancelledforex); } else { this.callbackinterface.oncancel(result); } } @override protected void onpostexecute(resulttype result) { this.callbackinterface.onsuccess(result); } }