<span style="background-color: rgb(255, 255, 255); font-family: 'Comic Sans MS'; font-size: 18px;"></span><pre code_snippet_id="1625680" snippet_file_name="blog_20160327_1_5498404" name="code" class="java">安卓应用开发应遵循单线程模型(Single Thread Modle)的原则。因为Android的UI操作并不是线程安全的,所以涉及UI的操作必须在UI线程中完成。但是并非所有的操作都能在主线程中进行,可能会导致ANR(Application No Response).所以开发者要遵循两条法则:1.不能阻塞UI线程。2.确保只在UI线程访问UI工具包。于是,就有了开启子线程进行异步处理的技术。
<span style="background-color: rgb(255, 255, 255); font-family: 'Comic Sans MS'; font-size: 18px;">一:采用AsyncTask</span>
三个参数:
AsyncTask<Params,Progress,Result>,三个参数由用户自己设定类型,如String,或是自定义的封装类型
*Params 启动任务执行的输入参数,比如http请求的URL
*Progress 后台任务执行的百分比,进度条等
*Result 后台执行任务最终返回的结果
四个主要方法:
*doInBackground(Params...) 子类必须实现的方法。主要负责执行那些耗时的后台处理工作。可以调用PublishProgress方法来更新实时的任务进度。
*onPreExecute() 该方法将在执行实际的后台操作前被UI线程调用。如在界面显示 一个进度条,或者是控件的实例化。
*onPostExecute() 在doInBackground()方法执行完成后被调用,并把结果通过该方法传递给UI线程,并且在界面上显示给用户。
*onProgressUpdate() 在publishprogress方法被调用后,UI线程将调用这个方法在界面上展示任务的进展情况。如通过一个进度条进行展示。
最后,在UI线程中通过execute()方法创建AsyncTask的实例。
实例:图片的异步加载。
public Bitmap getBitmapFromUrl(String urlString) {
Bitmap bitmap;
InputStream is = null;
try {
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
is = new BufferedInputStream(connection.getInputStream());
bitmap = BitmapFactory.decodeStream(is);
connection.disconnect();
return bitmap;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
private class newsAsyncTask extends AsyncTask
{
ImageView mImageView;
String mUrl;
public newsAsyncTask(ImageView image,String url) {
mImageView=image;
mUrl=url;
}
@Override
protected Bitmap doInBackground(String... params) {
return getBitmapFromUrl(params[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if (mImageView.getTag().equals(mUrl))
mImageView.setImageBitmap(bitmap);
}
public void showImageByAsyncTask(ImageView imageView,String url){
new newsAsyncTask(imageView,url).execute(url);
}