据我了解,带Ui的编程语言中都不建议或者不允许在Ui线程执行耗时较长的操作,比如访问网络下载图片等资源,否则会将软件“卡死”系统会因软件UI无响应而选择杀死软件进程。安卓也是一样,为了不影响用户体验,安卓的耗时操作一般都在后台线程中完成,最常见的就是异步线程AsyncTask了。
异步任务顾名思义,就是你做你的我做我的,互不侵犯,下面是一个异步任务的代码构成。
class getdepinfo extends AsyncTask< Map<String, String>, Void, String> { @Override protected void onPreExecute() { // progressDialog.show(); //异步任务开始 } @Override protected String doInBackground( Map<String, String>... params) { //耗时任务执行,这里是一个网络访问的任务 return HttpHelper.submitPostData("http://10.0.2.2/api.php",params[0],"utf-8"); } @Override protected void onProgressUpdate(Void... values) { //这里是在异步任务执行过程中的UI交互 } @Override protected void onPostExecute(String result) { // progressDialog.dismiss(); //异步任务执行完毕 } }
整个构成如上面代码所示,我标注了一些注释,我们通过
new getdepinfo().execute(info);
来启动异步任务,后面的info则是传入的参数,这个参数会被传递到异步任务中的doInBackground方法里面的params参数,通过params[0]取出第一个参数,我这里只传了一个info参数,所以在doInBackground方法里面用params[0]来使用,第二个参数则是params[1]。
值得注意的是class getdepinfo extends AsyncTask< Map<String, String>, Void, String> 这句,这句话说明了异步任务中的doInBackground、onProgressUpdate、onPostExecute三个方法的返回或传入数据类型。第一个参数是doInBackground方法的传入参数类型,我这里用的Map<String, String>。第二个参数说明了onProgressUpdate方法无返回值,第三个说明onPostExecute方法返回字符串类型数据。在异步任务的这些方法里都可以直接操作UI线程更新UI。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/242170.html