亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述Android-异步加载AsynsTask相关的知识,希望能为你提供帮助。
我们知道,在android中,只有UI线程能够更新UI,而子线程是不能更新UI。但是如果某个应用需要进行某种耗时的操作,如果在UI线程进行此操作的话,那会显得应用程序非常的卡顿,这个是不能允许存在的。于是,我们想到了使用子线程来进行这些耗时的操作,但是由于子线程不能更新UI,所以我们并不知道什么时候应该更新UI。
为了解决这个问题,Android出现了异步加载,而AsyncTask就是这个用途。
1.构建AsyncTask子类的参数
AsyncTask<
Params, Progress. Result>
是一个抽象类,通常用来被继承,继承AsyncTask需要指定如下三个泛型参数的:
A.Params:启动任务时输入参数的类型
B.Progress:后台任务执行中返回进度值的类型
C.Result:后台任务完成后返回结果的类型
2.构建AsyncTask子类的回调方法
A.doInBackGround:必须重写,子线程在这个方法里面进行耗时操作
B.onPreExecute:执行后台耗时操作前被调用,通常在方法里面进行一些初始化的操作
C.onPostExecute:当doInBackground完成后,系统会自动调用这个方法,并且将doInBackground方法返回的值传给该方法
D.onProgressUpdate:在doInBackground方法中调用publishProgress方法时,更新任务的执行进度后,会触发这个方法
3.使用AsyncTask来加载网络图片
1 class MyAsyncTask extends AsyncTask< String, Void, Bitmap> 2{ 3 4@Override 5protected Bitmap doInBackground(String... params) { 6try { 7Thread.sleep(3000); 8} catch (InterruptedException e) { 9e.printStackTrace(); 10} 11Bitmap bitmap = null; 12String urlString = params[0]; 13URLConnection urlConnection = null; 14InputStream is = null; 15URL url = null; 16try { 17url = new URL(urlString); 18urlConnection = url.openConnection(); 19is = urlConnection.getInputStream(); 20BufferedInputStream bis = new BufferedInputStream(is); 21bitmap = BitmapFactory.decodeStream(bis); 22} catch (MalformedURLException e) { 23e.printStackTrace(); 24} catch (IOException e) { 25e.printStackTrace(); 26} 27return bitmap; 28} 29 30@Override 31protected void onPreExecute() { 32super.onPreExecute(); 33mProgressBar.setVisibility(View.VISIBLE); 34} 35 36@Override 37protected void onPostExecute(Bitmap bitmap) { 38super.onPostExecute(bitmap); 39mProgressBar.setVisibility(View.GONE); 40mImageView.setImageBitmap(bitmap); 41} 42}
在AsynsTask中, 只有doInBackground运行在子线程,其他方法都在主线程当中,所以其他方法可以对UI进行操作
【Android-异步加载AsynsTask】 在这里,我们使用了java的流操作,自己对流的操作不是很熟悉,所以在这里提醒一下自己
4.模拟进度条的更新
1 class MyAsyncTask extends AsyncTask< Void , Integer, Void> 2{ 3 4@Override 5protected Void doInBackground(Void... params) { 6for(int i = 0; i < 100; i++) 7{ 8if(isCancelled()) 9{ 10return null; 11} 12publishProgress(i); 13try { 14Thread.sleep(300); 15} catch (InterruptedException e) { 16e.printStackTrace(); 17} 18} 19return null; 20} 21 22@Override 23protected void onProgressUpdate(Integer... values) { 24super.onProgressUpdate(values); 25if(isCancelled()) 26{ 27return; 28} 29mProgressBar.setProgress(values[0]); 30} 31} 32 33@Override 34protected void onPause() { 35super.onPause(); 36if(myAsyncTask != null & & myAsyncTask.getStatus() == AsyncTask.Status.RUNNING) 37{ 38myAsyncTask.cancel(true); 39} 40}
推荐阅读
- android 屏幕划分
- Android开始之Checkboxs
- Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be ena
- android studio jimu mirror插件破解版
- android 网络加载图片
- Android子线程访问网络
- Android性能测试--内存
- Excel中删除选定区域数据的高招_Excel专区
- PPT中闪动文字的自制窍门_PowerPoint专区