自定义适配器
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
开头会调用此接口。
参数:
url
String : 图片地址。requestListener
HippyImageRequestListener:图片异步拉取回调。param
Object:一些特殊场景定制参数,正常情况下无需关注。
示例如下:
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
等图片拉取场景会调用此接口。
参数:
url
string : 图片地址或者base64信息。param
Object:一些特殊场景定制参数,正常情况下无需关注。
示例如下:
@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获取到相关信息。