AsyncTask、Thread 写法

本文介绍了Android中线程的两种实现方式及消息处理机制,包括Handler、Message等组件的作用和工作原理。同时,深入探讨了AsyncTask的使用方法及其在异步任务中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试总是会被问到handler、message巴拉巴拉的,说起AsyncTask就会问它有哪些方法?分别干什么的。。。
天天用当然知道干嘛的,可每次一写就自动生成了,我这种重在出结果的人真没怎么注意到每一个方法名怎么拼,具体还要说在那个线程运行,,,好吧,都是借口,基础不够扎实。但是并不影响我做项目开发,我知道该干什么怎么用,,,然而面试官并不会搭理你这些的。。。哎,,

记几个线程的写法

##第一种 继承Thread ##
第一种:继承Thread,重写run()方法,郭霖大神的书里说”继承的耦合性有点高 ”,大学背过的知识点忘记了,去查了一下,大致意思就是,耦合性越高模块间的关联就越密切,从而模块独立性越差。用线程就是为了单独分离出来执行些耗时操作,所以一般选择第二种:实现接口形式的。

    class ThreadOne extends Thread {
        @Override
        public void run() {
            //处理逻辑
        }
    }
    //使用
    new ThreadOne().start();

##第二种 实现Runnable接口 ##
第二种,实现Runnable接口:

    class ThreadTwo implements Runnable{

        @Override
        public void run() {
            //处理逻辑  
        }
    }
    //使用
    ThreadTwo threadTwo=new ThreadTwo();
    new Thread(threadTwo).start();

//常见写法:使用匿名类的方式

        new Thread(new Runnable() {
            @Override
            public void run() {
                //逻辑
            }
        }).start();

异步消息处理机制

Android提供了一套异步消息处理机制,主要由4个部分组成:Message、Handler、MessageQueue、Looper。
其实平时用的能看到的也就Handler和message,如果只知道这俩说明知道怎么用,不过机制也弄懂才能进阶嘛,所有的技术点都是,不懂原理机制再聪明也做不到融汇贯通的。
这里写图片描述

这是第一行代码2中的一张图:平时使用的时候,都是
先创建一个Handler对象,并重写handleMessage()。
在需要操作UI的时候,创建Message对象,通过Handler发送出去。

具体内部原理看了下其他大神的详细源码分析,懂了些,希望过一段时间,我也能看源码自己找答案了。我现在就不班门弄斧了。简单记:

消息发出后,会被添加到MessageQueue的队列(先进先出)中等待被处理
Looper则会一直尝试从MessageQueue中读取待处理消息(有就读取没有就等待)
最后分发回handlerMwssage()方法中。

注:一个线程只会有一个消息队列(MessageQueue),也只有一个Looper对象来管理消息队列,但一个Looper可以对应多个Handler(处理者)

AsyncTask

Android提供的傻瓜式工具真是害人不浅,能让你啥都不懂就能开发,不过也是因为这一点,自己才能没学明白呢就可以养活自己了。不过现在既然干了这行,不能混,该懂得是一定要弄懂得。
AsyncTask是Android基于上述异步消息处理机制封装的工具,可以十分简单的从子线程切换到主线程。看下用法;

这里写图片描述

  • 重写AsyncTask的几个方法完成对任务的定制

这里写图片描述

  • 完整写法
public class AsyncTask_addClientCar extends AsyncTask<String, integer, String> {
	Handler hdler;

	public AsyncTask_addClientCar(Handler h) {
		super();
		hdler = h;
	}
	@Override
	protected void onPreExecute() {
		super.onPreExecute();
	}

	@Override
	protected String doInBackground(String... params) {
		String result = null;

		String clientId = params[0];
		String licensePlate = params[1];
		String licenseZone = params[2];
		String isCurrent = params[3];
		String Name = params[4];
        String VehicleLicenseNo = params[5];

		Map<String, String> pm = new HashMap<String, String>();
        pm.put("clientId", clientId);
        pm.put("licensePlate", licensePlate);
        pm.put("licenseZone", licenseZone);
        pm.put("isCurrent", isCurrent);
        pm.put("carbrandId", Name);
        pm.put("VehicleLicenseNo", VehicleLicenseNo);

		try {
			result = HttpUtils.sendPushRequest(Config.URL_addClientCar, pm);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	protected void onProgressUpdate(integer... values) {
		super.onProgressUpdate(values);
	}

	@Override
	protected void onPostExecute(String result) {
		super.onPostExecute(result);
        bindBean bean = new JsonParser<bindBean>().parserJsonBean(result, bindBean.class);
		hdler.sendMessage(hdler.obtainMessage(1, bean));
	}
}

  • 调用
new AsyncTask_addClientCar(handler).execute(clientId,licensePlate,licenseZone,"0",name,VehicleLicenseNo);
<think>好的,我现在需要处理用户关于在安卓10中使用Java编写Thread子线程的示例代码的请求。首先,我得回忆一下安卓开发中的多线程机制。安卓的主线程负责UI操作,子线程用于执行耗时任务,避免阻塞主线程。用户可能需要一个简单的例子来展示如何创建和启动子线程。 接下来,我需要确保代码符合安卓10的环境。虽然Thread本身是Java标准库的一部分,但在安卓中使用时需要注意UI更新的问题。根据引用[2],在子线程中直接更新UI会抛出异常,但Toast的显示可能通过WindowManager处理,有时可能不会触发异常。不过用户可能希望知道如何在子线程执行任务后正确更新UI。 用户提供的引用中有几个相关的点。引用[1]提到了UncaughtExceptionHandler,这可能对处理子线程中的异常有帮助,但用户主要求的是示例代码,这部分可能作为附加内容。引用[4]提到HandlerThread和Looper的使用,这可能涉及到更复杂的线程间通信,比如使用Handler将数据从子线程发送到主线程。 因此,示例代码应包括创建Thread子类或实现Runnable接口,启动线程,并在任务完成后通过Handler或runOnUiThread方法更新UI。同时,需要提醒用户不能在子线程中直接操作UI组件,如TextView的setText方法,必须切换到主线程。 另外,考虑到安卓10的特性,可能需要检查是否有API变更,但Thread的基本用法在安卓中相对稳定。所以示例代码可以保持传统写法,但加入必要的上下文,如在Activity中正确使用Handler或runOnUiThread。 最后,用户可能需要相关问题,例如如何传递数据、处理异常或优化线程管理。根据引用[3],RxJava的线程切换可能是一个高级话题,可以作为相关问题之一。</think>### 安卓10中使用Java编写Thread子线程的示例与实现方法 在Android开发中,主线程(UI线程)负责处理用户交互和界面更新,而耗时任务需通过子线程实现以避免阻塞主线程[^2][^4]。以下是基于Android 10的Java子线程实现示例: #### 1. 基础子线程实现(继承Thread类) ```java public class MyThread extends Thread { @Override public void run() { // 子线程执行耗时操作 String result = doBackgroundTask(); // 通过Handler切换到主线程更新UI new Handler(Looper.getMainLooper()).post(() -> { TextView textView = findViewById(R.id.text_view); textView.setText(result); }); } private String doBackgroundTask() { // 模拟耗时操作 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return "任务完成"; } } // 在Activity中启动线程 new MyThread().start(); ``` #### 2. 实现Runnable接口(推荐方式) ```java Runnable task = new Runnable() { @Override public void run() { // 子线程执行网络请求 String data = fetchDataFromServer(); // 使用runOnUiThread更新UI runOnUiThread(() -> { ProgressBar progressBar = findViewById(R.id.progress_bar); progressBar.setVisibility(View.GONE); Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show(); }); } }; // 启动线程 new Thread(task).start(); ``` #### 关键注意事项: 1. **UI更新限制**:子线程中不能直接操作UI组件(如`TextView.setText()`),必须通过`Handler`或`runOnUiThread`切换到主线程[^2][^4] 2. **线程通信**:推荐使用`Handler`+`Looper`机制或`AsyncTask`(已废弃)进行线程间通信 3. **异常处理**:建议通过`Thread.setUncaughtExceptionHandler`捕获未处理异常[^1] 4. **资源释放**:在Activity销毁时及时终止后台线程防止内存泄漏 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值