Android线程中队UI进行操作、按钮长按实现连续发送命令的效果、检测socket与服务器连接状态

线程中设置UI问题:

Android处于安全考虑,禁止在子线程中队系统的UI进行操作,因此,需要通过Handler对其进行处理。

在子线程中,当需要进行UI相关操作时,可通过Handler类实现。

1.在主线程中创建Handler,其功能为监听msg,当收到msg时进行一些操作

public Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {...}}}

2.在子线程中发送msg:

new Thread(new Runnable() {
	public void run() {
	try {
		mHandler.obtainMessage(1).sendToTarget();
		Thread.sleep(1000);
	<span style="white-space:pre">	</span>}
	} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				}
			}
	}).start();

实现长按按钮连续执行操作的效果:

本例中为长按某按钮时,手机通过TCP持续发送某个命令

public void hookMove(final Activity activity, final String cmd,
			MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			Toast.makeText(activity, "钩子开始移动", Toast.LENGTH_SHORT).show();
			longClicked = true;
			Thread t = new Thread() {
				@Override
				public void run() {
					super.run();
					while (longClicked) {
						// 发送命令
						TCPControl.sendCMD(cmd);
						try {
							Thread.sleep(250);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
			};
			t.start();

		} else if (event.getAction() == MotionEvent.ACTION_UP) {
			Toast.makeText(activity, "钩子停止移动", Toast.LENGTH_SHORT).show();
			longClicked = false;
			System.out.println("ACTION_UP");
		}

	}
hookUp.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
				cmd = "12" + strHookSelected + "3";
				hookMove(activity, cmd, event);
				return true;
			}
		});

判断手机的socket服务器的连接状态:

相对于系统提供的isConnected等函数来说,通过模拟Linux中的ping操作效果更好(http://blog.csdn.net/yudajun/article/details/10062339)

代码功能为向指定ip发送一个ping命令,若成功,则证明socket为连接状态

private static boolean startPing(String ip) {
		boolean success = false;
		Process p = null;

		try {
			p = Runtime.getRuntime().exec("ping -c 1 -i 0.2 -W 1 " + ip);
			int status = p.waitFor();
			if (status == 0) {
				success = true;
			} else {
				success = false;
			}
		} catch (Exception e) {
			success = false;
		} finally {
			p.destroy();
		}

		return success;
	}
时间: 2024-10-14 02:14:31

Android线程中队UI进行操作、按钮长按实现连续发送命令的效果、检测socket与服务器连接状态的相关文章

Android 线程更新UI报错 : Can&#39;t create handler inside thread that has not called Looper.prepare()

MainActivity中有一个按钮,绑定了save方法 public void save(View view) { String title = titleText.getText().toString(); String timelength = lengthText.getText().toString(); ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new NewsService(getApp

关于开启线程与UI的操作

当应用程序启动,创建了一个叫"main"的线程,用于管理UI相关,又叫UI线程.其他线程叫工作线程(Work Thread). Single Thread Model(单线程模型) 一个组件的创建并不会新建一个线程,他们的创建都在UI线程中进行,包括他们的回调方法,如onKeyDown(). 当在UI线程中进行某些耗时的操作时,将会阻塞UI线程,一般阻塞超过5秒就会报错. UI线程是非线程安全的,所以,不能在工作线程中操作UI元素. 两个原则 Do not block the UI t

android线程控制UI更新(Handler 、post()、postDelayed()、postAtTime)

按照下面的理解就是handler与ui线程有一定的关联可以因为更新界面只能在主线程中所有更新界面的地方可以在接受消息的handleMessage那里还有更新界面可以在handler.port(new Runnable))在自定义的线程中然后执行post方法通知主线程去更新这个界面 下面是参考: Android 线程是单线程的. 所以更新UI要用到Handler: private Handler splashHandler = new Handler() {public void handleMe

Android开发——实现子线程更新UI

Android中线程按功能分的话,可以分为两个,一个是主线程(UI线程),其他的都是子线程 主线程不能执行那些耗时过长的代码或任务(执行耗时过长的代码会出现应用未响应的提示),所以都是使用子线程来执行耗时过长的代码,比如说下载文件等任务 一般情况,子线程中执行过长的代码,都是需要进行更新UI操作. 但是Android中,为了防止安全,是不允许在子线程更新UI的,但是我们可以使用到Android官方给予的API来实现子线程更新UI的操作(本质上,这些API也是切换回了主线程来进行更新UI) 例子:

Android 按钮长按下去重复执行某个动作,放开后停止执行动作

Android开发中,常遇到一种需求,即按钮长按下去重复执行某个动作,放开后停止执行动作.网上找了许多代码,都没有适合的,于是自己动手写了一个. 基本思路是:首先设置一个标识变量,用于标识是否处于按下的状态.当按钮按下的时候,将标识变量设置为true,启动一个线程用于重复执行某个动作(当标识变量为true时,循环执行动作,当为false跳出循环,结束动作):当按钮弹起来的时候,将标识变量设置为false. 1.首先,设置标识变量 1 private boolean booleanConnect

Android关于线程更新UI的方法

Android关于线程更新UI的方法 在一个Android 程序开始运行的时候,会单独启动一个Process.默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的两种,除此之外还有Content Provider和Broadcast Receiver)都会跑在这个Process.   一个Android 程序默认情况下也只有一个Process,但一个Process下却可以有许多个Thread.   在

Android ActivityThread(主线程或UI线程)简介

1. ActivityThread功能 它管理应用进程的主线程的执行(相当于普通Java程序的main入口函数),并根据AMS的要求(通过IApplicationThread接口,AMS为Client.ActivityThread.ApplicationThread为Server)负责调度和执行activities.broadcasts和其它操作. 在Android系统中,在默认情况下,一个应用程序内的各个组件(如Activity.BroadcastReceiver.Service)都会在同一个

Android子线程更新UI主线程方法之Handler

背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. 下面说下有关Handler相关的知识. 多线程一些基础知识回顾:在介绍Handler类相关知识之前,我们先看看在Java中是如何创建多线程的方法有两种:通过继承Thread类,重写Run方法来实现通过继承接口Runnable实现多线程 具体两者的区别与实现,看看这篇文章中的介绍:http://de

Android中子线程和UI线程之间通信的方式

Android中子线程和UI线程之间通信的详细解释 1.在多线程编程这块,我们经常要使用Handler,Thread和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢?下面详解一下. 2.首先在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行. 3.Handler: (1).概念: Handler是沟通Activity 与Thread/runnable的桥梁.而Handler是运行在主UI线程中的,它与子线程