Androidは10-androidを記録した.os.NetworkOnMainThreadException例外解決策
1667 ワード
2013年11月1日光棍節
しばらく新しいブログを発表していませんが、最近ずっと新浪微博クライアントの開発に忙しいので、頭が痛いです.例えば、このブログで話すNetworkOnMainThreadExceptionという異常は、よくある問題かもしれませんが、筆記試験の問題でも聞くかもしれませんので、記録する価値があります.
なぜこの異常が発生したのか,まずその字面の意味を解析し,メインスレッドネットワーク操作に異常が発生した.明らかにメインスレッド、すなわちUIスレッドでは比較的時間のかかるネットワーク操作が行われており、このコード実装は符号化仕様に合致しない.AndroidではUIスレッドで5秒以上操作すればANRダイアログボックスがポップアップし、Androidが応答しないことを示すためである.そしてAndroid 2.3以上、StrictModeというクラスが導入されており、開発者が作成したアプリケーションを改善し、開発者が開発したアプリケーションに存在する問題を随時チェックして報告することができる様々なポリシーが提供されています.例えば、プライマリ・スレッドで完了すべきではない作業や、他の規範的で悪いコードを監視して、エラーを報告することができます.
巫女さん、最近新浪微博クライアントを開発していて、ネット操作が必要なのにこの間違いに遭遇しました.最初はどうやって解決するか分かりませんでしたが、後で調べてみると何が起こっているのか分かりました.Android 4.0は、ネットワーク操作がプライマリスレッドで行われることを許さない場合、どのように解決しますか.ネットワークリクエスト操作を非同期で行うのは簡単で、Androidが非同期操作に使えるクラスはAsyncTackとHandlerで、具体的にどのように使うかはプロジェクトの要求次第です.
Handlerの使用
AsyncTaskの使用
しばらく新しいブログを発表していませんが、最近ずっと新浪微博クライアントの開発に忙しいので、頭が痛いです.例えば、このブログで話すNetworkOnMainThreadExceptionという異常は、よくある問題かもしれませんが、筆記試験の問題でも聞くかもしれませんので、記録する価値があります.
なぜこの異常が発生したのか,まずその字面の意味を解析し,メインスレッドネットワーク操作に異常が発生した.明らかにメインスレッド、すなわちUIスレッドでは比較的時間のかかるネットワーク操作が行われており、このコード実装は符号化仕様に合致しない.AndroidではUIスレッドで5秒以上操作すればANRダイアログボックスがポップアップし、Androidが応答しないことを示すためである.そしてAndroid 2.3以上、StrictModeというクラスが導入されており、開発者が作成したアプリケーションを改善し、開発者が開発したアプリケーションに存在する問題を随時チェックして報告することができる様々なポリシーが提供されています.例えば、プライマリ・スレッドで完了すべきではない作業や、他の規範的で悪いコードを監視して、エラーを報告することができます.
巫女さん、最近新浪微博クライアントを開発していて、ネット操作が必要なのにこの間違いに遭遇しました.最初はどうやって解決するか分かりませんでしたが、後で調べてみると何が起こっているのか分かりました.Android 4.0は、ネットワーク操作がプライマリスレッドで行われることを許さない場合、どのように解決しますか.ネットワークリクエスト操作を非同期で行うのは簡単で、Androidが非同期操作に使えるクラスはAsyncTackとHandlerで、具体的にどのように使うかはプロジェクトの要求次第です.
Handlerの使用
1:Handler
Handler sendMessage(message) 。
Handler handler= new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//
textView.setText("zhangkai281");
}
};
public class MyThread extends Thread {
public void run() {
//
loadNetWork();
Message msg = new Message();
handler.sendMessage(msg);// Handler ,
}
}
AsyncTaskの使用
//UI
new DownloadImageTask().execute( "www.91dota.com" );
private class LoadTask extends AsyncTask {
protected String doInBackground( String... url ) {
return loadDataFormNetwork( url[0] );//
}
protected void onPostExecute( String result ) {
myText.setText( result ); //
}