-
我们知道,Android中只有UI线程,也就是主线程才能进行对UI的更新操作,而其他线程是不能直接操作UI的.这样的好处是保证了UI的稳定性和准确性,避免多个线程同时对UI进行操作而造成UI的混乱.但Android是一个多线程的操作系统,我们总不能把所有的任务都放在主线程中进行实现,比如网络操作,文件读取等耗时操作,如果全部放到主线程去执行,就可能会造成后面任务的阻塞.Android会去检测这种阻塞,当阻塞时间太长的时候,就会抛出Application Not Responsed(ANR)错误.所以我们需要将这些耗时操作放在非主线程中去执行.这样既避免了Android的单线程模型,又避免了ANR. .AsyncTask为何而生? 提到异步任务,我们能想到用线程,线程池去实现.确实,Android给我们提供了主线程与其他线程通讯的机制.但同时,Android也给我们提供了一个封装好的组件--AsyncTask.利用AsyncTask,我们可以很方便的实现异步任务处理.AsyncTask可以在子线程中更新UI,也封装简化了异步操作.使用线程,线程池处理异步任务涉及到了线程的同步,管理等问题.而且当线程结束的时候还需要使用Handler去通知主线程来更新UI.而AsyncTask封装了这一切,使得我们可以很方便的在子线程中更新UI.查看全部
-
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作为返回值返回给后面调用的方法查看全部
-
异步任务——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)查看全部
-
在AsyncTask的doInBackground()方法中调用publishProgress()方法可以将我们处理任务的进度反馈处理,我们这个时候就是用AsyncTask的onProgressUpdate()方法来承接我们传出来的进度,注意,由于在AsyncTask中,只有doInBackground()方法是工作在子线程中的,所以我们可以放心地在onProgressUpdate()方法中更新UI。查看全部
-
我将本课程的所有知识点整理成一篇博客供各位复习参考http://blog.csdn.net/leoleohan/article/details/46584153查看全部
-
AsyncTask子类的回调方法查看全部
-
AsyncTask的注意事项查看全部
-
网络操作作为不稳定的废时操作,从android 4.0开始就被严禁放入主线程中 通常采用在异步线程处理→下载图像 在UI线程→设置图像 ProgressBar XML属性 visibility="gone"可设置为默认状态下为隐藏查看全部
-
异步任务查看全部
-
调用异步操作的流程: 我们在主线程中创建MyAsyncTask的实例,调用execute()方法,就可以开启AsyncTask异步线程操作。 1. 在ImageTask.java的onCreate()方法中创建内部类MyAsyncTask对象,调用该对象的execute()方法,该方法开启异步线程的操作,execute()传进一个或多个参数,作为doInBackground(String... params)的参数。 2. onPreExecute()对整个异步操作做一些初始化操作,这里是显示进度条,提示用户等待。 3. doInBackground()做真正的异步操作处理,做任意的耗时操作,并返回指定的类型。 4. onPostExecute()获取异步操作的返回结果,由于onPostExecute()运行在主线程,方便我们操作UI,而这里的例子就是设置ImageView。 ----------------- 其他事项: 1. 在配置文件AndroidManifest.xml 中添加Activity: <activity android:name=".ImageTest" /> 并设置网络权限: <uses-permission android:name="android.permission.INTERNET"></uses> 2. 如果网速太给力,为了看到异步加载的效果,我们需要人为地增加时间。。。在doInBackgroung()中添加一句线程休眠操作: Thread.sleep(3000); 此方法需要捕捉异常。 3. 增加点击事件:在activity_main.xml中添加一个Button,直接在Buttonn中添加属性: android:onClick="loadImage",就声明了点击事件,然后在MainActivity中创建该方法: //点击事件 public void loadImage(View view){ startActivity(new Intent(this,ImageTest.class));//Activity之间的通信 } 该方法在onCreate()外面。查看全部
-
AsyncTask<String,Void,Bitmap>三个参数分别为:url类型,进度值类型,返回值类型。 这里的例子暂时不设置进度值,url设置为String类型,又因为我们加载的是一张Bitmap,所以返回的参数类型设置为 Bitmap。 1. doInBackground(String...params)传进来的是一个可变长数组,也就是说,我们可以传进不止一个参数(通过execute()传进来),这些参数依次存在于这个数组中。现在只有一个参数,所以只要写个params[0]取出对应的URL即可。 2. 定义一个Bitmap,也就是我们所要获取的Bitmap。 3. 定义一个访问网络的URLconnection,也就是一个网络连接对象connection。 4. 定义一个InputStream,用于获取数据的输入流。 5. 初始化connection:connection = new URL(url).openConnection();这里需要自行导入jar包:import java.net.URL; 另外需要try-catch包围。 6. 获取输入流:is = connection.getInputStream(); 7. 对输入流进行包装:BufferedInputStream bis = new BufferedInputStream(is); 8. 通过decodeStream()将输入流解析成 Bitmap:bitmap = BitmapFactory.decodeStream(bis); 9. 关闭输入流、返回 bitmap。查看全部
-
构建AsyncTack子类的参数 AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数: params:启动任务时输入参数的类型。 progress:后台任务执行中,返回进度值的类型。 Result:后台执行任务完成后,返回结果的类型。 ------------------------ 如何构建AsyncTask子类的回调方法? 一个完整的AsyncTask通常需要指定如下几个方法: 1. doInBackground:这是AsyncTask子类所必须要重写的方法,异步执行后台线程将要完成的任务。我们所有的耗时操作都将在这个方法中进行操作。 2. onPreExecute:执行后台耗时操作之前被调用,通常是用户完成一些初始化操作。 3. onPostExecute:当doInBackground()完成后,系统会自动调用此方法,并将doInBackground()返回的值传给该方法,也就是展示处理完成的结果。 4. onProgressUpdate:在doInBackground()方法中调用publishProgrsss()更新任务的执行进度后,就会触发该方法(必须先调用publishProgrsss()),就可以知道当前耗时操作的完成进度。 ---------------------------------- 额外补充: 1. 注意这里的例子继承的是 AsyncTask<Void,Void,Void>,需要带上三个泛型,定义Void泛型要注意V是大写。。。 2. 执行顺序:onPrRreExecute() --> doInBackground() --> onProgressUpdate() --> onPostExecute()。 3.publishProgress();传入进度条;在onProgressUpdate(Void...values)中获取进度条并更新查看全部
-
为什么需要使用异步任务? 我们知道,Android中只有UI线程,也就是主线程才能进行对UI的更新操作,而其他线程是不能直接操作UI的.这样的好处是保证了UI的稳定性和准确性,避免多个线程同时对UI进行操作而造成UI的混乱.但Android是一个多线程的操作系统,我们总不能把所有的任务都放在主线程中进行实现,比如网络操作,文件读取等耗时操作,如果全部放到主线程去执行,就可能会造成后面任务的阻塞.Android会去检测这种阻塞,当阻塞时间太长的时候,就会抛出Application Not Responsed(ANR)错误.所以我们需要将这些耗时操作放在非主线程中去执行.这样既避免了Android的单线程模型,又避免了ANR. .AsyncTask为何而生? 提到异步任务,我们能想到用线程,线程池去实现.确实,Android给我们提供了主线程与其他线程通讯的机制.但同时,Android也给我们提供了一个封装好的组件--AsyncTask.利用AsyncTask,我们可以很方便的实现异步任务处理.AsyncTask可以在子线程中更新UI,也封装简化了异步操作.使用线程,线程池处理异步任务涉及到了线程的同步,管理等问题.而且当线程结束的时候还需要使用Handler去通知主线程来更新UI.而AsyncTask封装了这一切,使得我们可以很方便的在子线程中更新UI.查看全部
-
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作为返回值返回给后面调用的方法查看全部
-
我几乎用了整整两个月的时间废寝忘食地才完成了我的第一个app。 一开始的时候,每天差不多要花4个多小时去看《Big Nerd Ranch》,然后根据教程练习。当我真正开始写程序的时候,哪怕是解决一个很小的问题,比如储存数据,我都得用不少时间才能充分理解。 不过我的时间很多,因为那时我正在放暑假,而且没别的事情做。 如果不得不寻求帮助和咨询问题,你会怎么做? 通常情况下我会用Google搜索。不过因为我还是新手,这得花我很多时间。最优选择是去 Stack Overflow。如果Stack Overflow仍然没能给出头绪,我会在reddit上的/r/androiddev Subreddit 上面发帖子,社区成员通常非常热心。 非常感谢PraneethVT能在关于建立第一个Android应用的问题上面,给出了他独特的见解。 欢迎点评,与君共勉。Android实战学习群 482189902查看全部
举报
0/150
提交
取消