java.lang.RuntimeException: Can't create handler inside thread that has not call

qq_33529268 2017-03-17 09:51:15
我并没有在子线程更新UI

03-17 13:42:17.527: W/EGL_emulation(9371): eglSurfaceAttrib not implemented
03-17 13:42:17.527: W/OpenGLRenderer(9371): Failed to set EGL_SWAP_BEHAVIOR on surface 0xae413580, error=EGL_SUCCESS
03-17 13:42:20.376: E/AndroidRuntime(9371): FATAL EXCEPTION: Thread-456
03-17 13:42:20.376: E/AndroidRuntime(9371): Process: com.zbq.mobilehospitalregister, PID: 9371
03-17 13:42:20.376: E/AndroidRuntime(9371): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
03-17 13:42:20.376: E/AndroidRuntime(9371): at android.os.Handler.<init>(Handler.java:200)
03-17 13:42:20.376: E/AndroidRuntime(9371): at android.os.Handler.<init>(Handler.java:114)
03-17 13:42:20.376: E/AndroidRuntime(9371): at android.app.Dialog.<init>(Dialog.java:119)
03-17 13:42:20.376: E/AndroidRuntime(9371): at android.app.AlertDialog.<init>(AlertDialog.java:200)
03-17 13:42:20.376: E/AndroidRuntime(9371): at android.app.AlertDialog$Builder.create(AlertDialog.java:1086)
03-17 13:42:20.376: E/AndroidRuntime(9371): at android.app.AlertDialog$Builder.show(AlertDialog.java:1111)
03-17 13:42:20.376: E/AndroidRuntime(9371): at com.zbq.mobilehospitalregister.activity.SplashActivity.showUpdateDialog(SplashActivity.java:229)
03-17 13:42:20.376: E/AndroidRuntime(9371): at com.zbq.mobilehospitalregister.activity.SplashActivity$1.handleMessage(SplashActivity.java:64)
03-17 13:42:20.376: E/AndroidRuntime(9371): at com.zbq.mobilehospitalregister.activity.SplashActivity$2.run(SplashActivity.java:186)
03-17 13:42:20.376: E/AndroidRuntime(9371): at java.lang.Thread.run(Thread.java:818)
03-17 13:42:20.734: E/Surface(9371): getSlotFromBufferLocked: unknown buffer: 0xa2b295b0
03-17 13:42:24.608: I/Process(9371): Sending signal. PID: 9371 SIG: 9
...全文
683 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
碼农李泽斌 2017-03-20
  • 打赏
  • 举报
回复
showUpdateDialog(),,,这东西肯定在主线程啊,更新界面的操作当然在主线程(UI线程)
qq_33529268 2017-03-18
  • 打赏
  • 举报
回复
这个showUpdateDialog()应该是在主线程吧
qq_33529268 2017-03-18
  • 打赏
  • 举报
回复
引用 1 楼 lizebin_bin 的回复:
你Show Dialog也是在UI线程的,所以你再子线程是不能操作的,so ,就按错误提示先调用Looper.prepare(),完了之后调用Looper.loop()方法就ok的
我没用过Looper.prepare()
	private void checkVersion() {
		// 网络请求在子线程中进行
		new Thread(new Runnable() {
			@Override
			public void run() {
				// 发送消息给主线程
				Message obtain = Message.obtain();
				long startTime = System.currentTimeMillis();
				try {
					URL url = new URL("http://192.168.99.136:8080/update.json");
					HttpURLConnection connection = (HttpURLConnection) url
							.openConnection();
					connection.setConnectTimeout(1500);// 请求超时
					connection.setReadTimeout(1500);// 读取超时
					// 相应码
					if (200 == connection.getResponseCode()) {
						// 获取数据流
						InputStream inputStream = connection.getInputStream();
						// 流转换成字符串
						String json = StreamUtil.stream2String(inputStream);
						// 解析json

						JSONObject jsonObject = new JSONObject(json);
						String versionName = jsonObject
								.getString("versionName");
						String versionCode = jsonObject
								.getString("versionCode");
						mVersionDescribe = jsonObject
								.getString("versionDescribe");
						mDownloadUrl = jsonObject.getString("downloadUrl");
						// 对比版本号
						if (mLocalVersionCode < Integer.parseInt(versionCode)) {
							// 提示更新
							obtain.what = UPDATE_VERSION;
						} else {
							// 直接进入主页面
							obtain.what = ENTER_HOME;
						}
					}
				} catch (MalformedURLException e) {
					e.printStackTrace();
					LogUtil.i(tag, "url异常");
					obtain.what = ENTER_HOME;
				} catch (IOException e) {
					e.printStackTrace();
					LogUtil.i(tag, "io异常");
					obtain.what = ENTER_HOME;
				} catch (JSONException e) {
					e.printStackTrace();
					LogUtil.i(tag, "json异常");
					obtain.what = ENTER_HOME;
				} finally {
					long endTime = System.currentTimeMillis();
					// 指定睡眠时间,请求网络时长超过3秒则不做处理
					if ((endTime - startTime) < 3000) {
						try {
							// 睡满3秒
							Thread.sleep(3000 - (endTime - startTime));
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					mHandler.handleMessage(obtain);
				}
			}
		}).start();
	}
private Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case UPDATE_VERSION:
				// 弹出询问更新对话框
				showUpdateDialog();
				break;
			case ENTER_HOME:
				// 直接进入
				enterHome();
				break;
			default:
				break;
			}
		};

	};
protected void showUpdateDialog() {
		Builder builder = new AlertDialog.Builder(this);
		// 对话框左上角图标
		builder.setIcon(R.drawable.ic_launcher);
		// 标题
		builder.setTitle("版本更新");
		// 内容
		builder.setMessage(mVersionDescribe);
		// 积极按钮
		builder.setPositiveButton("立即更新", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// 点击事件,下载apk
				downloadApk();
			}
		});
		// 消极按钮
		builder.setNegativeButton("稍后再说", new OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// 关闭对话框,进入主界面
				enterHome();
				dialog.dismiss();
			}
		});
		//如果两个按钮都不点击,而点击后退
		builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
			@Override
			public void onCancel(DialogInterface dialog) {
				// 关闭对话框,进入主界面
				enterHome();
				dialog.dismiss();
			}
		});
		builder.show();
	}
碼农李泽斌 2017-03-17
  • 打赏
  • 举报
回复
你Show Dialog也是在UI线程的,所以你再子线程是不能操作的,so ,就按错误提示先调用Looper.prepare(),完了之后调用Looper.loop()方法就ok的

80,493

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧