AsyncTask用法和异步加载图片

AsyncTask:是Android提供的轻量级的异步类,能够直接继承AsyncTask,在类中实现异步操做,并提供接口反馈当前异步执行的程度(能够经过接口实现UI进度更新),最后反馈执行的结果给UI主线程。html

AsyncTask (异步任务),从字面上来讲,就是在咱们的UI主线程运行的时候,异步的完成一些操做。AsyncTask容许咱们的执行一个异步的任务在后台。咱们能够将耗时的操做放在异步任务当中来执行,并随时将任务执行的结果返回给咱们的UI线程来更新咱们的UI控件。经过AsyncTask咱们能够轻松的解决多线程之间的通讯问题。java

 

4个步骤:当咱们执行一个异步任务的时候,其须要按照下面的4个步骤分别执行android

  • onPreExecute(): 这个方法是在执行异步任务以前的时候执行,而且是在UI Thread当中执行的,一般咱们在这个方法里作一些UI控件的初始化的操做,例如弹出要给ProgressDialog
  • doInBackground(Params... params): 在onPreExecute()方法执行完以后,会立刻执行这个方法,这个方法就是来处理异步任务的方法,Android操做系统会在后台的线程池当中开启一个worker thread来执行咱们的这个方法,因此这个方法是在worker thread当中执行的,这个方法执行完以后就能够将咱们的执行结果发送给咱们的最后一个 onPostExecute 方法,在这个方法里,咱们能够从网络当中获取数据等一些耗时的操做
  • onProgressUpdate(Progess... values): 这个方法也是在UI Thread当中执行的,咱们在异步任务执行的时候,有时候须要将执行的进度返回给咱们的UI界面,例以下载一张网络图片,咱们须要时刻显示其下载的进度,就可使用这个方法来更新咱们的进度。这个方法在调用以前,咱们须要在 doInBackground 方法中调用一个 publishProgress(Progress) 的方法来将咱们的进度时时刻刻传递给 onProgressUpdate 方法来更新
  • onPostExecute(Result... result): 当咱们的异步任务执行完以后,就会将结果返回给这个方法,这个方法也是在UI Thread当中调用的,咱们能够将返回的结果显示在UI控件上

一个超简单的理解 AsyncTask 的例子:AsyncTask来从网络上加载一张图片git

Activity代码:github

private Button btn;
private ImageViewimageView;
privateProgressDialog progressDialog;
private final String IMGURL= "http://img0.pconline.com.cn/pconline/1206/18/2829090_3867bd63fd673471aa184c02_500.jpg";
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.asynctask_img);
        btn=(Button)findViewById(R.id.buttonOnClicksAsyncTask);
        imageView =(ImageView)findViewById(R.id.imageViewss);
        progressDialog = newProgressDialog(this);
        progressDialog.setTitle("提示信息");
        progressDialog.setMessage("正在下载中,请稍后......");
        progressDialog.setCancelable(false);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        btn.setOnClickListener(newView.OnClickListener()
        {
            @Override
            public voidonClick(View v)
            {
            // 在UI Thread当中实例化AsyncTask对象,并调用execute方法
                newMAsyncTask().execute(IMGURL);
            }
        });
    }

 public class MAsyncTask extends AsyncTask<String, Integer, byte[]>
    {
        @Override
        protected voidonPreExecute()
        {
            super.onPreExecute();
            progressDialog.show();
        }
        @Override
        protected byte[]doInBackground(String... params)
        {
            HttpClient httpClient = newDefaultHttpClient();
            HttpGet httpGet = newHttpGet(params[0]);
            byte[] image =new byte[]{};
            try
            {
                HttpResponse httpResponse =httpClient.execute(httpGet);
                HttpEntity httpEntity =httpResponse.getEntity();
                if(httpEntity!= null &&httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
                {
                    image = EntityUtils.toByteArray(httpEntity);
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
               httpClient.getConnectionManager().shutdown();
            }
            return image;
        }
        @Override
        protected voidonProgressUpdate(Integer... values)
        {
            super.onProgressUpdate(values);
        }
        @Override
        protected voidonPostExecute(byte[] result)
        {
            super.onPostExecute(result);
            //    将doInBackground方法返回的byte[]解码成要给Bitmap
            Bitmap bitmap = BitmapFactory.decodeByteArray(result,0, result.length);
            //    更新咱们的ImageView控件
            imageView.setImageBitmap(bitmap);
            progressDialog.dismiss();
        }
    }
}

一个ImageView控件和一个Button控件,当点击Button控件时,弹出一个ProgressDialog,而后开启一个异步任务,从网络中下载一张图片,并更新到咱们的ImageView上。这里还要注意一点,若是咱们要访问网络,必须还要给其受权才行网络

AndroidManifest.xml文件:多线程

<uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
         >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 </application>

效果图:app

 

源码下载:异步

 

AndroidStudio下载:  https://github.com/DickyQie/AsynTaskDemo.gitasync

相关文章
相关标签/搜索