安卓第七天---okhttp的简单使用及异步任务(Asynctask)下载图片

编程就是要严谨,并且要多去了解一些技术的原理,了解了原理,一切都会学习的很快,但从一个先想在这个编程行业立足来说,首先要知道会用,毕竟实践出真知,用的多了,就熟了!
扯远了,首先,在Android studio上,OkHttp现在已经不用去自己像第三方框架那样去集成他了,只需要在File->Project Structure然后选中需要加载OkHttp的项目点击右上方的Dependencies,右边又一个绿色的+号,打开输入okhttp就能搜到!
安卓第七天---okhttp的简单使用及异步任务(Asynctask)下载图片_第1张图片

选中图中的那个等加载好久可以使用了!
由于这里我只用作从网上下载一个图片,所以这里就简单一点了
创建一个类,用作撰写OkHttp的独有工具类:
private static OkHttpClient okHttpClient;

public static Bitmap getImageBitmap(String urlPath) {
    Bitmap bitmap = null;
    okHttpClient = new OkHttpClient();
    URL url = null;
    try {
        url = new URL(urlPath);
        //获取请求对象
        Request request = new Request.Builder().url(url).build();
        //获取响应体
        ResponseBody responseBody = okHttpClient.newCall(request).execute().body();

        //获取流--写入数据
        InputStream inputStream = responseBody.byteStream();

        //转化成Bitmap
        bitmap = BitmapFactory.decodeStream(inputStream);
        
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return  bitmap;
}

到这里,一个从网上获取图片,然后转化成Bitmap的方法就做好了,然后就是如何将这个bitmap图片设置到我们的控件上去了.
我们在这里建立一个异步任务!
我们可以了解到,Android中只有UI线程,也就是主线程才能进行对UI的更新操作,而其他线程是不能直接操作UI的.这样的好处是保证了UI的稳定性和准确性,避免多个线程同时对UI进行操作而造成UI的混乱.但Android是一个多线程的操作系统,我们总不能把所有的任务都放在主线程中进行实现,比如网络操作,文件读取等耗时操作,如果全部放到主线程去执行,就可能会造成后面任务的阻塞.Android会去检测这种阻塞,当阻塞时间太长的时候,就会抛出Application Not Responsed(ANR)错误.所以我们需要将这些耗时操作放在非主线程中去执行.这样既避免了Android的单线程模型,又避免了ANR.
所以,在AsyncTask中进行对UI的操作,但是这里我们为了更好的逻辑体验,将UI设置还是放置到Activity中进行操作,但是加载放在Asynctask即异步任务里面去执行,所以,我们需要设置一个回调接口SetImage,将参数放到接口之中,然后从Activity中实现
interface SetImage:

   	public interface SetImage {	
   	 public void setImageBitmap(Bitmap bitmap);
	}

AsynctaskDemo.class

public class AsyncDemo extends AsyncTask {
private SetImage setImage;

public AsyncDemo(Context context) {
    setImage = (SetImage) context;
}
@Override
protected Bitmap doInBackground(String... strings) {
    Bitmap bitmap =  OkHttpDownload.getImageBitmap(strings[0]);
    return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
    setImage.setImageBitmap(bitmap);
}
}

AsyncTask主要有如下几个方法:

doInBackground:必须重写,异步执行后台线程要完成的任务,耗时操作将在此方法中完成.

onPreExecute:执行后台耗时操作前被调用,通常用于进行初始化操作.

onPostExecute:当doInBackground方法完成后,系统将自动调用此方法,并将doInBackground方法返回的值传入此方法.通过此方法进行UI的更新.

onProgressUpdate:当在doInBackground方法中调用publishProgress方法更新任务执行进度后,将调用此方法.通过此方法我们可以知晓任务的完成进度.

实现设置ImageView的主函数

public class MainActivity extends AppCompatActivity implements SetImage{
private ImageView imageView;
private TextView textView;
private String url="这里是图片网址";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageView = findViewById(R.id.image);
    //在未加载图片之前,先给ImageView一个图片
    imageView.setImageResource(R.mipmap.ic_launcher);
    //执行Asynctask
    new AsyncDemo(this).execute(url);
}
//通过回调接口去实现更改ImageView
@Override
public void setImageBitmap(Bitmap bitmap) {
    imageView.setImageBitmap(bitmap);
}
}

下面的截图:
安卓第七天---okhttp的简单使用及异步任务(Asynctask)下载图片_第2张图片

一个简单的异步任务就到这,学无止境,继续加油!

你可能感兴趣的:(Android)