android 4について0でのアクセスネットワークはメインスレッドではできません.Handlerの使用はできません.

2374 ワード

Googleは4.0システム以降、メインスレッドへのネットワークアクセスを禁止しています.理由は次のとおりです.
メインスレッドは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で処理します.