Android异步加载

异步加载很重要,接下来简析一下。
主线程主要负责界面事件的处理,因此不能在主线程中处理一些耗时的操作,否则会出现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 "下载完成!";
        }
    }
}

这里有一个我写的具体的实例和优化,同样也是下载:

http://blog.csdn.net/little_shengsheng/article/details/51314897

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值