• AsyncTask的初步了解


    下面以下载图片并显示为例:

    首先我们需要知道的是AsyncTask是对线程池+Handler的进一步封装。

    下面看一个简单的代码:

     1 public class MainActivity extends Activity {
     2     private ImageView ivIcon;
     3     private static String myUrl = "http://192.168.1.2:8080/tomcat.gif";//图片的ip地址
     4     @Override
     5     protected void onCreate(Bundle savedInstanceState) {
     6         super.onCreate(savedInstanceState);
     7         setContentView(R.layout.activity_main);
     8         ivIcon = (ImageView)findViewById(R.id.iv_icon);
     9         
    10         new MyTask().execute(myUrl);// 启动AsyncTask
    11     }
    12 
    13     // AsyncTask 异步封装的工具, 可以实现异步请求及主界面更新(对线程池+handler的封装)
    14     class MyTask extends AsyncTask<String,Integer,Bitmap>{
    15 
    16         // 1.预加载, 运行在主线程
    17         @Override
    18         protected void onPreExecute() {
    19             super.onPreExecute();
    20         }
    21 
    22         // 2.正在加载, 运行在子线程(核心方法), 可以直接异步请求
    23         @Override
    24         protected Bitmap doInBackground(String... params) {
    25             return  downLoad(params[0]);
    26         }
    27 
    28         // 3.更新进度的方法, 运行在主线程
    29         @Override
    30         protected void onProgressUpdate(Integer... values) {
    31             super.onProgressUpdate(values);
    32         }
    33 
    34         // 4.加载结束, 运行在主线程(核心方法), 可以直接更新UI
    35         @Override
    36         protected void onPostExecute(Bitmap bitmap) {
    37             ivIcon.setImageBitmap(bitmap);
    38         }
    39     }
    40 
    41     /**
    42      * 从服务器下载图片
    43      * @param url  服务器的IP
    44      * @return 请求成功返回Bitmap对象,不成功返回null
    45      */
    46     private Bitmap downLoad(String url){
    47         try {
    48             HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
    49             conn.setRequestMethod("GET");
    50             conn.setConnectTimeout(5000);
    51             conn.setReadTimeout(5000);
    52             conn.connect();
    53 
    54             int code = conn.getResponseCode();
    55 
    56 
    57             if (code==200){
    58                 InputStream inputStream = conn.getInputStream();
    59                 Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
    60                 return bitmap;
    61             }
    62         } catch (IOException e) {
    63             e.printStackTrace();
    64         }
    65 
    66         return null;
    67     }
    68 }

    需要注意的是AsyncTask里面的doInBackground()方法是运行在子线程的,剩下的三个方法是运行在主线程的。所以我们在doInBackground()方法中做耗时操作。

    GitHub:https://github.com/godfunc
    博客园:http://www.cnblogs.com/godfunc
    Copyright ©2019 Godfunc
  • 相关阅读:
    【01】国内外git托管平台(总结by魔芋)
    【01】git下载和安装的完整过程
    分享一些正确的放松方式
    【03】图解原型和原型链by魔芋
    求一个正整数的阶乘
    乘法表
    Web Best Practices
    【03】const
    【02】块级作用域
    【01】let和const命令
  • 原文地址:https://www.cnblogs.com/Godfunc/p/6131074.html
Copyright © 2020-2023  润新知