Android异步加载
2016-05-04 16:21
141 查看
异步加载很重要,接下来简析一下。
主线程主要负责界面事件的处理,因此不能在主线程中处理一些耗时的操作,否则会出现ANR,即Application Not Responding(应用程序无响应,俗称,死机,卡顿)。为了避免出现ANR,需要将耗时操作放到子线程中进行处理,同时可以使用Handler进行消息的传递。除了使用Handler,Android为了简化操作为我们提供了一个封装好的异步任务类AsyncTask。
1:
2:
3:
如果不需要某个参数的时候,可以使用Void进行替换。根据需要可以重写AsyncTask中的相关方法。AsyncTask中方法执行顺序及关系可参照图
AsyncTask中常用方法如下:
onPreExecuter() 该方法在主线程中执行,在后台操作执行前被调用,主要用于初始化操作。
doInBackground(Params…) 该方法用于完成耗时操作,运行在子线程中。在该方法中可以调用publishProgress(Progress…)方法公布执行进度。
onPostExecute(Result r) 当doInBackground方法执行完成后,会调用该方法,并将操作结果传递给该方法。该方法运行在主线程中。
publishProgress(Progress…) 在doInBackground方法中调用,对外公布执行进度。该方法一旦被调用,将会执行onProgressUpdate方法。该方法在子线程执行。
onProgressUpdate(Progress…) 该方法运行在主线程中。用于接收publishProgress公布的进度信息。
使用AsyncTask需要注意以下几点:
1. AsyncTask对象只能在主线程中创建。
2. AsyncTask对象的执行方法execute(Params… params)只能在主线程中调用。
3. AsyncTask中的方法,如doInBackground、onPreExecute等是由系统调用的。
4. AsyncTask对象的只能被执行一次。
AsyncTask异步任务类小实例,模拟下载:
这里有一个我写的具体的实例和优化,同样也是下载:
/article/7579754.html
主线程主要负责界面事件的处理,因此不能在主线程中处理一些耗时的操作,否则会出现ANR,即Application Not Responding(应用程序无响应,俗称,死机,卡顿)。为了避免出现ANR,需要将耗时操作放到子线程中进行处理,同时可以使用Handler进行消息的传递。除了使用Handler,Android为了简化操作为我们提供了一个封装好的异步任务类AsyncTask。
AsyncTask<Params,Progress,Result>是一个抽象类,使用的时候需要继承该类并需要传递三个泛型参数,分别为:
1:
Params:后台任务执行所需要的参数。
2:
Progress:后台任务执行的进度。
3:
Result:后台任务执行的结果。
如果不需要某个参数的时候,可以使用Void进行替换。根据需要可以重写AsyncTask中的相关方法。AsyncTask中方法执行顺序及关系可参照图
AsyncTask中常用方法如下:
onPreExecuter() 该方法在主线程中执行,在后台操作执行前被调用,主要用于初始化操作。
doInBackground(Params…) 该方法用于完成耗时操作,运行在子线程中。在该方法中可以调用publishProgress(Progress…)方法公布执行进度。
onPostExecute(Result r) 当doInBackground方法执行完成后,会调用该方法,并将操作结果传递给该方法。该方法运行在主线程中。
publishProgress(Progress…) 在doInBackground方法中调用,对外公布执行进度。该方法一旦被调用,将会执行onProgressUpdate方法。该方法在子线程执行。
onProgressUpdate(Progress…) 该方法运行在主线程中。用于接收publishProgress公布的进度信息。
使用AsyncTask需要注意以下几点:
1. AsyncTask对象只能在主线程中创建。
2. AsyncTask对象的执行方法execute(Params… params)只能在主线程中调用。
3. AsyncTask中的方法,如doInBackground、onPreExecute等是由系统调用的。
4. AsyncTask对象的只能被执行一次。
AsyncTask异步任务类小实例,模拟下载:
public class AnsyncTaskActivity extends AppCompatActivity { private ProgressBar progressBar; private TextView show; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ansync_task); progressBar = (ProgressBar)findViewById(R.id.progressBar); show=(TextView)findViewById(R.id.show); findViewById(R.id.btnDownload).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DownloadTask task= new DownloadTask(); task.execute(); } }); } private class DownloadTask extends AsyncTask<Void,Integer,String>{ @Override protected void onPreExecute() { super.onPreExecute(); progressBar.setMax(100); progressBar.setProgress(0); show.setText("开始下载……"); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); show.setText(result); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); int curProgress = values[0]; progressBar.setProgress(curProgress); show.setText("当前进度为:"+curProgress+"%"); } @Override protected String doInBackground(Void... params) { for(int i=1;i<=100;i++){ publishProgress(i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } return "下载完成!"; } } }
这里有一个我写的具体的实例和优化,同样也是下载:
/article/7579754.html
相关文章推荐
- Permission Denial: not allowed to send broadcast android.intent.action.SCREEN_OFF
- Android Volley框架的几种post提交请求方式
- android实现自定义控件及如何在其他项目中使用
- Android自定义底部导航条控件
- AndroidImageSlider 滚动图片 viewpager
- Android中几种Button的监听方法
- android listview+popuwindow动态显示遇到的问题
- 解读Android官方MVP项目单元测试
- 关于android studio中遇到APl level的问题的常见解决办法
- 谷歌chrome模拟手机浏览网页:iPhone/Android
- Android隐藏应用图标,简单到哭
- android 5.0 zygote启动代码流程
- Android 学习记录-contentProvider
- 使用radiobutton实现底部导航栏
- Android Json解析
- Android属性动画(一) ------ 站在巨人的肩膀上学习总结
- android如何查看cpu的占用率和内存泄漏
- Android开发笔记(九十五)自定义Drawable
- 给 Android 开发者的 RxJava 详解
- Android控件设置可点击