AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程.

.为什么需要使用异步任务?

我们知道,Android中只有UI线程,也就是主线程才能进行对UI的更新操作,而其他线程是不能直接操作UI的.这样的好处是保证了UI的稳定性和准确性,避免多个线程同时对UI进行操作而造成UI的混乱.但Android是一个多线程的操作系统,我们总不能把所有的任务都放在主线程中进行实现,比如网络操作,文件读取等耗时操作,如果全部放到主线程去执行,就可能会造成后面任务的阻塞.Android会去检测这种阻塞,当阻塞时间太长的时候,就会抛出Application Not Responsed(ANR)错误.所以我们需要将这些耗时操作放在非主线程中去执行.这样既避免了Android的单线程模型,又避免了ANR.

.AsyncTask为何而生?

提到异步任务,我们能想到用线程,线程池去实现.确实,Android给我们提供了主线程与其他线程通讯的机制.但同时,Android也给我们提供了一个封装好的组件–AsyncTask.利用AsyncTask,我们可以很方便的实现异步任务处理.AsyncTask可以在子线程中更新UI,也封装简化了异步操作.使用线程,线程池处理异步任务涉及到了线程的同步,管理等问题.而且当线程结束的时候还需要使用Handler去通知主线程来更新UI.而AsyncTask封装了这一切,使得我们可以很方便的在子线程中更新UI.

.构建AsyncTask子类的泛型参数

AsyncTask

public class NewThread2 extends Activity {    private TextView text1;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        text1 = (TextView) findViewById(R.id.text1);        Button btn = (Button) findViewById(R.id.btn1);        btn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                readUrl("https://www.baidu.com");            }        });    }    public void readUrl(String Url) {        new AsyncTask<String, Void, String>() {            // 此方法必须重写,异步执行后台线程需要完成的任务            @Override            protected String doInBackground(String... params) {                try {                    URL url = new URL(params[0]);                    URLConnection connection = url.openConnection();                    InputStream is = connection.getInputStream();                    InputStreamReader isr = new InputStreamReader(is);                    BufferedReader bis = new BufferedReader(isr);                    String Line;                    StringBuilder builder = new StringBuilder();                    while ((Line = bis.readLine()) != null) {                        builder.append(Line);                    }                    bis.close();                    isr.close();                    is.close();                    return builder.toString();                } catch (MalformedURLException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                return null;            }            // 执行后台耗时操作时前被调用,通常用来完成一些初始化操作            @Override            protected void onPreExecute() {                Log.d("TAG", ">>>>>>>>>>>>>>>>>>>");                // TODO Auto-generated method stub                super.onPreExecute();            }            // 当doinBackground()完成过后,系统自动调用,并将方法的返            //回值传给onpostexecute()可运行在主线程操作ui            @Override            protected void onPostExecute(String result) {                // TODO Auto-generated method stub                text1.setText(result);                super.onPostExecute(result);            }            // doinBackground()方法中调用publishProgress()方法更行任务的执行进度后,就会触发该方法            @Override            protected void onProgressUpdate(Void... values) {                // TODO Auto-generated method stub                super.onProgressUpdate(values);            }            @Override            protected void onCancelled(String result) {                // TODO Auto-generated method stub                super.onCancelled(result);            }            @Override            protected void onCancelled() {                // TODO Auto-generated method stub                super.onCancelled();            }        }.execute(Url);    }}

新启一个线程来读取网站、、、

AsyncTask是基于线程池进行实现的,当一个线程没有结束时,后面的线程是不能执行的.
cancel方法只是将对应的AsyncTask标记为cancelt状态,并不是真正的取消线程的执行.
onCancelled()方法被调用后,onPostExecute(Result result)方法将不再被调用。

.使用AsyncTask的注意事项

① 必须在UI线程中创建AsyncTask的实例.

② 只能在UI线程中调用AsyncTask的execute方法.

③ AsyncTask被重写的四个方法是系统自动调用的,不应手动调用.

④ 每个AsyncTask只能被执行(execute方法)一次,多次执行将会引发异常.

⑤ AsyncTask的四个方法,只有doInBackground方法是运行在其他线程中,其他三个方法都运行在UI线程中,也就说其他三个方法都可以进行UI的更新操作.

详解请看大神博客
http://blog.csdn.net/liuhe688/article/details/6532519

更多相关文章

  1. Android(安卓)高级UI解密 (五) :PathMeasure截取片段 与 切线(新思
  2. Android(安卓)Studio 中高德地图申请key和获取sha1及配置的几点
  3. android监听自身被卸载的方法
  4. Android属性动画完全解析(下) Interpolator和ViewPropertyAnimat
  5. android中的多线程编程及消息机制
  6. Android--线程池实现方式解析
  7. 一次重拾Android(安卓)Studio开发的经历
  8. Android从源码的角度彻底理解事件分发机制的解析(下)
  9. Android(安卓)apk安装过程及Java、JNI读取安装包内assets资源文

随机推荐

  1. Android(安卓)SDK 实例代码分析---Accele
  2. Android(安卓)ListView/ListActivity点击
  3. Android(安卓)2.2 API Demos -- Intents
  4. Android(安卓)QQ第三方登录
  5. Android(安卓)onPause和onSaveInstanceSt
  6. Android事件分发机制——View(一)
  7. Android:TabLayout向上滑动停留页面顶部
  8. Android点击WebView中的图片查看大图
  9. Android——Framework Resource添加使用
  10. 【Android动画九章】-AlphaAnimation(渐变