[android.os.NetworkOnMainThreadException を解決してください。
まず引っかかりを感じたので、ブラッシングすることにしました。前作は アンドロイド 2.3 システム . 戻ってきて4.4にフラッシュした。
OK、ここで問題発生です。私の携帯電話で私たちのアプリをテストすると、問題のような例外が発生しました: android.os.NetworkOnMainThreadException
最初にこの例外を見たとき、文字通り「メインスレッド上のネットワーク例外」と書いてありました。それから、この例外を理解するために、まず、以下の公式説明を見てみました。
パブリッククラス
NetworkOnMainThreadException
extends RuntimeException<テーブル java.lang.Object ? java.lang.Throwable ? java.lang.Exception ? java.lang.RuntimeException ? android.os.NetworkOnMainThreadException
クラス概要
アプリケーションがそのメインスレッドでネットワーク操作を行おうとしたときにスローされる例外です。
これは、Honeycomb SDK 以降をターゲットとするアプリケーションにのみスローされます。以前のSDKバージョンをターゲットとするアプリケーションは、メインイベントループスレッドでネットワーキングを行うことができますが、それは非常に推奨されません。
以下もご参照ください。
StrictMode
.
だから、物事はかなり明確です。メインスレッドでネットワーク操作を要求したアプリは、この例外をスローします。アンドロイドは、ネットワーク要求に時間がかかりすぎて、インターフェースが誤って死んでしまうことを防ぐために設計されています。
解決策は2つあり、1つはStrictModeを使用すること、もう1つはスレッドを使用してネットワーク要求を操作することです。
最初の方法:シンプルでブルートフォース、簡単なコード変更で済む(ただし、非常にお勧めできない)。
MainActivity ファイルの setContentView(R.layout.activity_main) の下に以下のコードを追加します。
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
2つ目の方法は、私が使っている方法であり、私が推奨する方法です。ネットワークリソースを要求するコードを操作するためにThreadを使用します。UIスレッドをブロックすることなく、Runnableの中でHTTPリクエストを行います。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main_view);
new Thread(runnable).start();
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle data = msg.getData();
String val = data.getString("value");
Log.i(TAG,"Request result:" + val);
}
}
Runnable runnable = new Runnable(){
@Override
public void run() {
// TODO: http request.
Message msg = new Message();
Bundle data = new Bundle();
data.putString("value","RequestResult");
msg.setData(data);
handler.sendMessage(msg);
}
}
上記は、より一般的なアプローチで、私のコードです。
// HTTP requests cannot be made in the main thread after Android 4.0
new Thread(new Runnable(){
@Override
public void run() {
cachedImage = asyncImageLoader.loadDrawable(imageUrl, position);
imageView.setImageDrawable(cachedImage);
}
}).start();
さて、今日のこのくだりはこれで終わりです。実はアンドロイド開発に関するくだりはこれで全部なのです。他のくだらないことは、以下のコラムをご覧ください。
Android開発のうんちくについては、コラム:"Android開発のうんちくをご覧ください。
関連
-
Solve Android 仮想メソッドの呼び出しに失敗する。NULLオブジェクトの参照で
-
GPSプロンプトの問題は、Callがユーザーによって拒否される可能性のある許可を必要とすることです:コードは、明示的にsをチェックする必要があります。
-
スレッド内にハンドラを作成できない Looper.prepare() を呼び出していないスレッド
-
Android studio java ファイル表示 j burst red
-
エラーの報告です。ArrayAdapter は、リソース ID が TextView である必要があります。
-
リターンスタックpopBackStack()のAndroidフラグメント、リターンonResumeの問題
-
Android マルチメディア MediaPlayerの使用方法詳細
-
ColorDrawableの簡単な使い方
-
アンドロイドについて:DescendantFocusability いくつかの使用感
-
開始します。Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
android studioについて Error:Execution failed for task ':app:preDebugAndroidTestBuild'. 解決方法
-
AndroidでFragmentを使用すると、Fragmentの内部コントロールを取得できず、findViewById()の結果がNullになる - 解決済み
-
jniとjavaの間でbytearrayを受け渡しする
-
アンドロイドにおけるemsの本当の意味
-
Androidです。ViewPagerで現在のインターフェイスのFragmentを取得する
-
ライブ画面録画のAndroid実装 (a) ScreenRecorderの簡易解析
-
Androidアプリの放送受信機登録(registerReceiver)処理の分析
-
Android Studio精彩案例(七)《ToolBar使用详解<一>》
-
Android - Androidに多階層メニュー連携操作を実装。
-
android.content.ActivityNotFoundException: Intenを処理するアクティビティが見つからない