android 4について0でのアクセスネットワークはメインスレッドではできません.Handlerの使用はできません.
2374 ワード
Googleは4.0システム以降、メインスレッドへのネットワークアクセスを禁止しています.理由は次のとおりです.
メインスレッドはUIを担当する応答であり,メインスレッドでネットワークアクセスを行うと5秒を超えると強制シャットダウンを起こすため,このような時間のかかる操作はメインスレッドに入れられない.サブスレッドに入れると,サブスレッドではメインスレッドのUIを変えることができないため,Handlerが引き出され,メインスレッドではHandlerが定義され,サブスレッドでは使用される.
メインスレッドのHandler定義:
サブスレッドのHandlerの使用:
メインスレッドはUIを担当する応答であり,メインスレッドでネットワークアクセスを行うと5秒を超えると強制シャットダウンを起こすため,このような時間のかかる操作はメインスレッドに入れられない.サブスレッドに入れると,サブスレッドではメインスレッドのUIを変えることができないため,Handlerが引き出され,メインスレッドではHandlerが定義され,サブスレッドでは使用される.
メインスレッドのHandler定義:
Handler loginHandler = new Handler() {
public void handleMessage(Message msg) {
isNetError = msg.getData().getBoolean("isNetError");
System.out.println(isNetError);
if (proDialog != null) {
proDialog.dismiss();
}
if (isNetError) {
Toast.makeText(LoginActivity.this, " :
1. .
2. !",
Toast.LENGTH_LONG).show();
}
//
else {
Toast.makeText(LoginActivity.this, noticeMsg,
Toast.LENGTH_LONG).show();
// SharePreferences
clearSharePassword();
}
}
};
メインスレッドに登録するときのサブスレッド:// , , startAcitivity(Intent)
Thread loginThread = new Thread(new LoginFailureHandler());
loginThread.start();
サブスレッドのHandlerの使用:
/**
*
* @author wangfeng
* @date 2013-12-19 09:25:42
*
*/
class LoginFailureHandler implements Runnable {
@Override
public void run() {
/*userName = userNameEdit.getText().toString();
password = loginPasswordEdit.getText().toString();*/
//
String validateURL=url+"/login";
boolean loginState = validateLocalLogin(userNameEdit.getText().toString(), loginPasswordEdit.getText().toString(),
validateURL);
Log.d(this.toString(), "validateLogin");
//
// ---
loginState = true;
//---
if (loginState) {
// ,
Intent intent = new Intent();
intent.setClass(LoginActivity.this, ListViewActivity.class);
Bundle bundle = new Bundle();
/*bundle.putString("MAP_USERNAME", userNameEdit.getText().toString());
intent.putExtras(bundle);*/
//
proDialog.dismiss();
startActivity(intent);
} else {
// handler UI UI,
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putBoolean("isNetError", isNetError);
message.setData(bundle);
loginHandler.sendMessage(message);
}
}
}
messgaeを通過する.setDataメソッドバーBudleを持ち込んでHandlerを通ります.sendMessageメッセージを入れてHandlerのhandlerMessageで処理します.