编程就是要严谨,并且要多去了解一些技术的原理,了解了原理,一切都会学习的很快,但从一个先想在这个编程行业立足来说,首先要知道会用,毕竟实践出真知,用的多了,就熟了!
扯远了,首先,在Android studio上,OkHttp现在已经不用去自己像第三方框架那样去集成他了,只需要在File->Project Structure然后选中需要加载OkHttp的项目点击右上方的Dependencies,右边又一个绿色的+号,打开输入okhttp就能搜到!
选中图中的那个等加载好久可以使用了!
由于这里我只用作从网上下载一个图片,所以这里就简单一点了
创建一个类,用作撰写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);
}
}
一个简单的异步任务就到这,学无止境,继续加油!