7.1 KiB
Executable File
自定义适配器
Android App开发中存在很多第三方基础库。
比如图片缓存系统常用的有:Picasso、Glide、Fresco等。
Hippy SDK如果在代码中直接集成这些第三方基础库,很有可能与你的项目实际情况冲突。为了解决这个矛盾点,Hippy SDK将所有基础能力接口化,抽象为Adapter,方便业务注入实现,同时大多数基础能力我们也默认实现了一个最简单的方案。
Hippy SDK现在所提供的Adapter包括:
HippyImageLoaderAdapter:图片加载Adapter。HippyHttpAdapter:Http请求Adapter。HippyExceptionHandlerAdapter:引擎和JS异常处理Adapter。HippySharedPreferencesAdapter:SharedPreferences Adapter。HippyStorageAdapter:数据库(KEY-VALUE)Adapter。HippyExecutorSupplierAdapter:线程池Adapter。HippyEngineMonitorAdapter:Hippy 引擎状态监控Adapter。
HippyImageLoaderAdapter
由于图片加载复杂度较高,实现需要增加SDK包大小,而且每个App都有自己的图片加载机制,所以SDK不提供默认实现。
HippyImageRequestListener
图片加载回调接口。主要包括以下方法:
onRequestStart:图片加载开始。onRequestSuccess:图片加载成功。onRequestFail:图片加载失败。
HippyDrawableTarget
图片包装接口。提供的接口主要包括:
getBitmap:SDK会通过此方法回去图片拉取后的Bitmap。onDrawableAttached:图片渲染上屏后SDK会回调。onDrawableDetached:图片离屏后SDK会回调。
fetchImage
异步拉图接口。Url 以 Http、Https、File开头会调用此接口。
参数:
urlString : 图片地址。requestListenerHippyImageRequestListener:图片异步拉取回调。paramObject:一些特殊场景定制参数,正常情况下无需关注。
示例如下:
public class ImageLoaderAdapter implements HippyImageLoaderAdapter
{
@Override
public void fetchImage(String url, final HippyImageRequestListener requestListener, Object param)
{
// 这里采用Glide库来拉取图片
Glide
.with(ContextHolder.getAppContext())
.load(url)
.asBitmap()
.into(new DrawableTarget(requestListener));
}
}
public class DrawableTarget extends SimpleTarget<Bitmap> implements HippyDrawableTarget
{
HippyImageRequestListener mListener;
Bitmap mBitmap;
public DrawableTarget(HippyImageRequestListener listener)
{
this.mListener = listener;
}
@Override
public Bitmap getBitmap()
{
return mBitmap;
}
@Override
public String getSource()
{
return null;
}
@Override
public Object getExtraData()
{
return null;
}
@Override
public void onDrawableAttached()
{
}
@Override
public void onDrawableDetached()
{
}
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation<? super Bitmap> glideAnimation)
{
this.mBitmap = bitmap;
// 通知Hippy SDK图片拉取成功
mListener.onRequestSuccess(this);
}
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable)
{
// 通知Hippy SDK图片拉取失败
mListener.onRequestFail(e, null);
}
}
getImage
同步拉图接口。主要针对 assets、base64等图片拉取场景会调用此接口。
参数:
urlString : 图片地址或者base64信息。
paramObject:一些特殊场景定制参数,正常情况下无需关注。
示例如下:
@Override
public HippyDrawableTarget getImage(String url, Object param)
{
LocalHippyDrawable resultHippyDrawable = new LocalHippyDrawable();
// if use drawable res please set Context
// resultHippyDrawable.setContext(mContext);
resultHippyDrawable.setUrl(url);
return resultHippyDrawable;
}
public class LocalHippyDrawable implements HippyDrawableTarget
{
String mUrl;
Context mContext;
public void setUrl(String url)
{
mUrl = url;
}
public void setContext(Context context)
{
mContext = context;
}
@Override
public Bitmap getBitmap()
{
if (TextUtils.isEmpty(mUrl))
{
return null;
}
try
{
if (mUrl.startsWith("data:"))
{
// base64 image
int base64Index = mUrl.indexOf(";base64,");
if (base64Index >= 0)
{
base64Index += ";base64,".length();
String base64String = mUrl.substring(base64Index);
byte[] decode = Base64.decode(base64String, Base64.DEFAULT);
return BitmapFactory.decodeByteArray(decode, 0, decode.length);
}
}
else if (mUrl.startsWith("file://"))
{
// local file image
return BitmapFactory.decodeFile(mUrl.substring("file://".length()));
}
else
{
// local resource image
if (mContext != null)
{
int id = mContext.getResources().getIdentifier(mUrl, "drawable", mContext.getPackageName());
InputStream is = mContext.getResources().openRawResource(id);
return BitmapFactory.decodeStream(is);
}
}
}
catch (Throwable throwable)
{
return null;
}
return null;
}
@Override
public String getSource()
{
return mUrl;
}
@Override
public Object getExtraData()
{
return null;
}
@Override
public void onDrawableAttached()
{
}
@Override
public void onDrawableDetached()
{
}
}
HippyHttpAdapter
Hippy SDK提供默认的实现,DefaultHttpAdapter。如果DefaultHttpAdapter无法满足你的需求,请参考DefaultHttpAdapter代码接入HippyHttpAdapter实现。
HippyExceptionHandlerAdapter
Hippy SDK提供默认空实现,DefaultExceptionHandler。当你的业务基于Hippy上线后,必然会出现一些JS异常,监控这些异常对于线上质量具有很重要的意义。Hippy SDK会抓取这些JS异常,然后通过HippyExceptionHandlerAdapter抛给使用者。
handleJsException
处理抓取到的JS异常。JS异常不会导致引擎不可运行,但可能导致用户感知或者业务逻辑出现问题,是线上质量的最重要衡量标准。
HippySharedPreferencesAdapter
Hippy SDK提供默认的实现,DefaultSharedPreferencesAdapter。大多数场景也不需要进行扩展。
HippyStorageAdapter
Hippy SDK提供默认的实现,DefaultStorageAdapter。
HippyExecutorSupplierAdapter
Hippy SDK提供默认的实现,DefaultExecutorSupplierAdapter。
HippyEngineMonitorAdapter
Hippy SDK提供默认空实现,DefaultEngineMonitorAdapter。当你需要查看引擎加载速度和模块加载速度时,可以通过此Adapter获取到相关信息。