为何不能在其他线程中更新UI:保持UI也就是主线程的稳定性,准确性,避免多个线程同时操作UI产生的混乱。

为何要使用子线程:

Android是单线程模型,但又是多线程操作系统,耗时操作(网络操作,读取文件)如果全部在主线程中执行,就会造成后面任务的阻塞,系统会自动检测阻塞,当阻塞时间过长时,android就会抛出ANR,启动子线程,既可以保证Android的单线程模型,又可以防止ANR。异步处理方式:线程,线程池,AsyncTask


1. 用处:
将耗时操作放在非主线程中执行,既保证了Android单线程模型,也保证了程序的响应(不出现ANR)
AsyncTask在子线程中更新UI,封装、简化异步操作
2. AsyncTask<Params, Progress, Result>
是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数:
Params:启动任务时输入参数的类型
Progress:后台任务执行中返回进度值的类型
Result:后台执行任务完成后返回结果的类型
注意:参数不是一定要使用, private class MyTask extends AsyncTask<Void, Void, Void> { ... }
3. 在继承AsyncTask的子类中需要重写的回调方法
(如图)
onPreExecute()->doInBackground(Params...)->调用publishProgress(Progress...)->onProgressUpdate(Progress...)->doInBackground(Params...)执行结束->onPostExecute(Result)


doInBackground方法传入的是一个可变长数组,在execute方法中可以传递不止一个参数,存入params数组中
String url = params[0];//本例中只传入一个地址
Bitmap bitmap = null;
URLConnection connection;//定义网络连接对象
InputStream is;//用于获取数据的输入流
connection = new URL(url).openConnection();//获取网络连接对象,需要被try_catch
is = connection.getInputStream();//获取输入流
BufferedInputStream bis = new BufferedInputStream(is);
bitmap = BitmapFactory.decodeStream(bis);//将输入流解析成bitmap
is.close();//关闭输入流
bis.close();

ruturn bitmap;//将bitmap作为返回值返回给后面调用的方法



与UI线程通信
在onPreExecute()方法中
mProgressBar.setVisibility(View.VISIBLE);//显示进度条

在onPostExectute(Bitmap bitmap)方法中,参数是doInBackground()方法返回的参数
mProgressBar.setVisibility(View.GONE);//将进度条隐藏
mImageView.setImageBitmap(bitmap);//将图片设置为解析出来的网络图片

然后在onCreate方法中
new MyAsyncTask().execute(URL);//开启AsyncTask的异步线程操作,设置传递进去的参数


使用AsyncTask创建线程执行任务的时候,我们需要使得创建的线程的生命周期和我们Activity的生命周期一致。
即,当我们的Activity不可见的时候,我们需要及时“取消”我们AsyncTask中正在执行还没有执行完的任务,这样,等下次Activity出现的时候,我们才能给用户开始执行新任务的体验。否则,我们后台需要执行完上次的任务才能执行新的任务,这样会给我们用户一个“长时间等待无响应”的感觉。
通过调用mAsyncTask.cancel()方法可以取消AsyncTask的执行,但是注意这只是发送了一个cancel的请求,将对应的AsyncTask标记为cancel状态,并没有将其停止掉。
需要在doInBackground()方法中持续判断这个标记位

更多相关文章

  1. Android 4.4 Dialog 被状态栏遮挡的解决方法
  2. Android线程与异步消息处理机制
  3. android系统裁剪方法
  4. android ui线程和数据的分离

随机推荐

  1. Android中Google地图折线层(Polyline)
  2. Android(安卓)用HorizontalScrollView实
  3. Android(安卓)动态指定屏幕朝向,动态设置
  4. mac 下android开发 eclipse中找不到设备
  5. [置顶] Android中的观察者DataSetObserva
  6. 记录走过路过的那些博客
  7. Android官方技术文档翻译——迁移 Gradle
  8. Android读取Assert文件夹下txt文本并变为
  9. Android(安卓)MediaScanner.cpp 源代码解
  10. Android(安卓)Canvas的save()和restore()