异步线程之AsyncTask

1、使用新线程的原因:
android的UI线程主要负责处理用户的按键事件、用户触屏事件及屏幕绘图事件,因此其它其它操作不应该、也不能阻止UI线程,否则UI界面将会变得停止响应。
2、解决新线程不能更新UI组件的问题
    2.1、使用Handler实现线程通信
    2.2、Activity.runOnUiThread(Runnable)
    2.3、View.post(Runnable)
    2.4、View.postDelayed(Runnable)
    2.5、AsyncTask

3、AsyncTask的使用:AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承
    3.1、参数介绍:Params,启动任务执行输入参数的类型,Progress后台任务完成的进度值的类型,Result后台完成后返回结果的类型
    3.2、方法介绍:
          3.2.1、AsyncTask.cancel(boolean)如果是true,如果线程执行,则会被打断,如果是false,线程将会被运行执行完成
           3.2.2、onPreExecute()//一般用来做一些初始化操作
           3.2.3、doInBackground(String... strings)//处理后台线程要完成的任务
           3.2.4、onProgressUpdate(Integer ... values)
                //在doInBackgrounp()方法中调用 publishProgress(Progress... values)方法更新任务执行的进度,将会触发该方法
           3.2.5、onPostExecute(Integer result)//doInBackGrounp()完成后自动调用此方法,用来处理结果
        new AsyncTask<String,Void,Integer>(){//如果为泛型参数,就设为void

            protected void onPreExecute() {}

            //处理后台线程要完成的任务
            protected Integer doInBackground(String... strings) {
                //strings[0]=account  strings[1]=pwd
                return loginCode;
            }

            protected void onProgressUpdate(Integer ... values){}

            //doInBackGrounp()完成后自动调用此方法,用来处理结果
            protected void onPostExecute(Integer result) {}
        }.execute(account,pwd,host);
     3.3、超时处理
        private Handler uiHandler = new Handler(){
            public void handleMessage(Message msg) {
                switch(msg.what){
                case cancelMyTask:
                    if(myTask!=null && !myTask.isCancelled()
                        && myTask.getStatus() == AsyncTask.Status.RUNNING){
                        myTask.cancel(true);
                        myTask = null;
                        showLayout.setVisibility(View.GONE);
                        MyToast.showToastLong(context, "连接超时");
                    }
                    break;
                }
            }
        };

        final MyTask myTask = new MyTask();//继承AsyncTask
        //只是打断AsyncTask,并没有结束掉myTask.cancel(true);
        myTask.execute(account,pwd,host);
        Thread thread = new Thread(){
            public void run(){
                try{
                    myTask.get(5000, TimeUnit.MILLISECONDS);
                }catch(InterruptedException e){
                }catch(ExecutionException e){
                }catch(TimeoutException e){
                    uiHandler.sendEmptyMessage(cancelMyTask);;
                }
            }
        };
        
时间: 2024-11-16 20:14:12

异步线程之AsyncTask的相关文章

Android线程之AsyncTask

在之前的博客中为大家分享过关于Android多线程处理,想必大家对于Android为什么要使用多线程已经有了清晰的认识,我就在简单唠两句,Android规定UI界面的更新必须在在主线程进行,对于访问网络的耗时操作必须在子线程中执行,所以如果你想成为一名真正的Android开发工程师,多线程是你的必修课.本篇带给大家关于Android为我们封装好的一个简单的线程类AsyncTask. AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提

android线程之 Handler与AsyncTask的应用

做应用程序的开发的时候,我们程序员更多的关心的是线程. 一个android应用程序开启后,默认开启一个主线程(大部分都和UI相关,所以又叫UI 线程).在UI线程上面运行的Avtivity组件,Service组件,BroadcastReceiver组件. 用户操作主线程时,需要注意不允许在UI线程中做耗时的操作.比如:复杂的逻辑计算,休眠,联网,下载数据等都是耗时的操作.如果在UI主线程中做耗时的操作,一旦超过5秒,应用程序抛出异常,会报一个ANR(Application not respond

Android 多线程之IntentService 完全详解

关联文章: Android 多线程之HandlerThread 完全详解 Android 多线程之IntentService 完全详解 android多线程-AsyncTask之工作原理深入解析(上) android多线程-AsyncTask之工作原理深入解析(下) IntentService 一.IntentService概述 ??上一篇我们聊到了HandlerThread,本篇我们就来看看HandlerThread在IntentService中的应用,看本篇前建议先看看上篇的HandlerT

iOS多线程之GCD小记

iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言的,在在oc中使用时需要包含 #import<pthread.h> 使用这种多线程方案需要手动处理线程的各个状态的转换,也就是要管理线程的生命周期. 2.NSThread 这种多线程方案经过了苹果的封装,是一种面向对象的方案,因此可以直接操控线程对象,相对来说比较便捷,其生命周期也要手动管理 3.

多线程之join方法

join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法.如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完.而使用join方法后,直到这个线程退出,程序才会往下执行.下面的代码演示了join的用法. package mythread; public class JoinThread extends Thre

OC多线程之GCD

要了解多线程首先要知道什么是进程,什么是进程? 正在进行中的程序被称为进程,负责程序运行的内存分配 每一个进程都有自己独立的虚拟内存空间 什么是线程: 线程是进程中一个独立的执行路径(控制单元) 一个进程中至少包含一条线程,即主线程 可以将耗时的执行路径(如:网络请求)放在其他线程中执行 创建线程的目的就是为了开启一条新的执行路径,运行指定的代码,与主线程中的代码实现同时运行 线程的优缺点: 优势 (1)充分发挥多核处理器优势,将不同线程任务分配给不同的处理器,真正进入“并行运算”状态 (2)将

Asp.Net Core 轻松学-多线程之Task(补充)

前言 ????在上一章 Asp.Net Core 轻松学-多线程之Task快速上手 文章中,介绍了使用Task的各种常用场景,但是感觉有部分内容还没有完善,在这里补充一下. 1. 任务的等待 在使用 Task 进行基于队列的异步任务(TAP)的时候,对于刚入门的同学来说,只是简单的了解了使用 Task 可以在后台处理异步任务,但是对于阻塞调用可能还有有一些不太明白,异步任务默认是不阻塞的执行过程,当一个 Task 被创建出来的时候,并没有被压入队列中,而是开始执行的时候,才会进入队列中:执行一个

OC多线程之GCD ----- 2

dispatch_create生成的Queue不管是并行队列还是串行队列,其优先级都是默认优先级 但是可以用dispatch_set_target_queue来改变队列的优先级 dispatch_set_target_queue(原来的队列, 目标优先级队列) 使用这个函数需要获取两个队列,一个是需要变更优先级的队列,一个是指定优先级的队列(指定优先级的队列可以通过get_global获得) 如果多个串行队列优先级相同,那么这些队列里的任务也会串行执行 dispatch_after函数并不能非常

JAVA多线程之wait/notify

本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait() 与  notify/notifyAll() 的执行过程 ③中断 调用wait()方法进入等待队列的 线程 ④notify 通知的顺序不能错 ⑤多线程中测试某个条件的变化用 if 还是用 while? ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 wait()