Files
Hippy/docs/android/custom-adapter.md
T
2020-01-01 12:37:21 +08:00

7.1 KiB
Executable File
Raw Blame History

自定义适配器

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:图片异步拉取回调。
  • 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获取到相关信息。