简介
universal-image-loader是一个开源的Android异步加载图片的库,提供一个可重复使用的仪器为异步图像加载,缓存和显示。具体的介绍可以自行搜索,也可以直接看该项目在github上的wiki。
由于最近在关注一个Android图片加载的问题,就看下这个库具体要如何使用。
使用方法
1.引入
目前我使用的android开发工具是Android Studio,要使用universal-image-loader只要将相应的jar包下载并导入到工程中即可。具体的导入步骤,可以参见文章《Android Studio导入第三方的jar包》,记录的还算详细。
不过,目前android开发都推荐使用android studio,所以依赖管理都会使用gradle。在gradle引入universal-image-loader很简单,只要在项目的配置文件build.gradle引入相应版本还就可以。
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
2.权限问题
要使用universal-image-loader一般需要额外给工程加2个权限:访问网络和写入SD卡。想想也知道,要访问网络图片肯定需要网络,如果图片缓存一般情况也都是缓存到SD卡的。
给工程加权限肯定需要修改AndroidManifest.xml文件。
<uses-permission android:name="android.permission.INTERNET" ></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
3.UI
因为是只是初步接触,所以布局就不搞的非擦汗那个复杂,只是放一个ImageView用以显示图片。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/imageView"
android:layout_gravity="center_horizontal|top" />
</FrameLayout>
4.注册
通过查询官方的文档,在使用universal-image-loader时,一般需要自己定义一个Application,然后在该Application中完成universal-image-loader初始化操作。所以需要自己定义一个MyApplication,并且将该类在AndroidManifest.xml引入,不然的话android启动不会调用该类。
首先,定义MyApplication类,并继承Application。
package mungo.org.myapplication;
import android.app.Application;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
/**
* Created by Administrator on 2015/6/9.
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//ImageLoader
ImageLoaderConfiguration configuration = ImageLoaderConfiguration
.createDefault(this);
//Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(configuration);
}
}
然后修改AndroidManifest.xml中application节点,添加
android:name=".MyApplication"
这里需要注意的是,MyApplication类的路径需要在AndroidManifest.xml定义的package下面,不然会找不到。
package="mungo.org.myapplication" >
5.使用
这个时候,配置的工作基本就完成了。剩下的就是如何使用universal-image-loader加载网络图片,并且显示在之前定义的布局文件中的ImageView上了。
可以使用ImageLoader.getInstance().loadImage()方法,loadImage方法有一系列的重载方法。这里就选用比较简单一种,至于其他的,在实际应用中慢慢接触吧,算是抛砖引玉吧。
loadImage需要传入图片url和一个ImageLoadingListener实例即可。
ImageLoader.getInstance().loadImage(imageUrl,new SimpleImageLoadingListener(){
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view, loadedImage);
mImageView.setImageBitmap(loadedImage);
}
});
下面是MainActivity完整代码:
package mungo.org.myapplication;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
public class MainActivity extends Activity {
private static final String LOG_TAG = MainActivity.class.getSimpleName();
ImageView mImageView;
String imageUrl = "http://img5.imgtn.bdimg.com/it/u=747474479,3247936386&fm=21&gp=0.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(LOG_TAG, "onCreate");
mImageView= (ImageView) findViewById(R.id.imageView);
ImageLoader.getInstance().loadImage(imageUrl,new SimpleImageLoadingListener(){
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view, loadedImage);
mImageView.setImageBitmap(loadedImage);
}
});
}
@Override
protected void onStart() {
Log.e(LOG_TAG, "onStart");
super.onStart();
}
@Override
protected void onResume() {
Log.e(LOG_TAG, "onResume");
super.onResume();
}
@Override
protected void onPause() {
Log.e(LOG_TAG, "onPause");
super.onPause();
}
@Override
protected void onStop() {
Log.e(LOG_TAG, "onStop");
super.onStop();
}
@Override
protected void onDestroy() {
Log.e(LOG_TAG, "onDestroy ");
super.onDestroy();
}
}
6.效果
以上代码就全部完成,看下效果。
总结
这里只是对universal-image-loader做了最简单的使用介绍,他的功能远不止这些,而且在实际运用中代码可能也不会这么写,而是采用universal-image-loader框架本身更为高效的做法。同时,这里也没涉及到框架的缓存。等等这些只能在使用中慢慢熟悉了。