自定义适配器

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 如果以 HttpHttpsFile 开头会调用此接口。

参数:

  • url String : 图片地址。
  • requestListener HippyImageRequestListener:图片异步拉取回调。
  • param Object:一些特殊场景定制参数,正常情况下无需关注。

示例如下:

  1. public class ImageLoaderAdapter implements HippyImageLoaderAdapter
  2. {
  3. @Override
  4. public void fetchImage(String url, final HippyImageRequestListener requestListener, Object param)
  5. {
  6. // 这里采用Glide库来拉取图片
  7. Glide
  8. .with(ContextHolder.getAppContext())
  9. .load(url)
  10. .asBitmap()
  11. .into(new DrawableTarget(requestListener));
  12. }
  13. }
  14. public class DrawableTarget extends SimpleTarget<Bitmap> implements HippyDrawableTarget
  15. {
  16. HippyImageRequestListener mListener;
  17. Bitmap mBitmap;
  18. public DrawableTarget(HippyImageRequestListener listener)
  19. {
  20. this.mListener = listener;
  21. }
  22. @Override
  23. public Bitmap getBitmap()
  24. {
  25. return mBitmap;
  26. }
  27. @Override
  28. public String getSource()
  29. {
  30. return null;
  31. }
  32. @Override
  33. public Object getExtraData()
  34. {
  35. return null;
  36. }
  37. @Override
  38. public void onDrawableAttached()
  39. {
  40. }
  41. @Override
  42. public void onDrawableDetached()
  43. {
  44. }
  45. @Override
  46. public void onResourceReady(Bitmap bitmap, GlideAnimation<? super Bitmap> glideAnimation)
  47. {
  48. this.mBitmap = bitmap;
  49. // 通知Hippy SDK图片拉取成功
  50. mListener.onRequestSuccess(this);
  51. }
  52. @Override
  53. public void onLoadFailed(Exception e, Drawable errorDrawable)
  54. {
  55. // 通知Hippy SDK图片拉取失败
  56. mListener.onRequestFail(e, null);
  57. }
  58. }

getImage

同步拉图接口。主要针对 assetsbase64 等图片拉取场景会调用此接口。

参数:

  • url string : 图片地址或者base64信息。
  • param Object:一些特殊场景定制参数,正常情况下无需关注。

示例如下:

  1. @Override
  2. public HippyDrawableTarget getImage(String url, Object param)
  3. {
  4. LocalHippyDrawable resultHippyDrawable = new LocalHippyDrawable();
  5. // if use drawable res please set Context
  6. // resultHippyDrawable.setContext(mContext);
  7. resultHippyDrawable.setUrl(url);
  8. return resultHippyDrawable;
  9. }
  10. public class LocalHippyDrawable implements HippyDrawableTarget
  11. {
  12. String mUrl;
  13. Context mContext;
  14. public void setUrl(String url)
  15. {
  16. mUrl = url;
  17. }
  18. public void setContext(Context context)
  19. {
  20. mContext = context;
  21. }
  22. @Override
  23. public Bitmap getBitmap()
  24. {
  25. if (TextUtils.isEmpty(mUrl))
  26. {
  27. return null;
  28. }
  29. try
  30. {
  31. if (mUrl.startsWith("data:"))
  32. {
  33. // base64 image
  34. int base64Index = mUrl.indexOf(";base64,");
  35. if (base64Index >= 0)
  36. {
  37. base64Index += ";base64,".length();
  38. String base64String = mUrl.substring(base64Index);
  39. byte[] decode = Base64.decode(base64String, Base64.DEFAULT);
  40. return BitmapFactory.decodeByteArray(decode, 0, decode.length);
  41. }
  42. }
  43. else if (mUrl.startsWith("file://"))
  44. {
  45. // local file image
  46. return BitmapFactory.decodeFile(mUrl.substring("file://".length()));
  47. }
  48. else
  49. {
  50. // local resource image
  51. if (mContext != null)
  52. {
  53. int id = mContext.getResources().getIdentifier(mUrl, "drawable", mContext.getPackageName());
  54. InputStream is = mContext.getResources().openRawResource(id);
  55. return BitmapFactory.decodeStream(is);
  56. }
  57. }
  58. }
  59. catch (Throwable throwable)
  60. {
  61. return null;
  62. }
  63. return null;
  64. }
  65. @Override
  66. public String getSource()
  67. {
  68. return mUrl;
  69. }
  70. @Override
  71. public Object getExtraData()
  72. {
  73. return null;
  74. }
  75. @Override
  76. public void onDrawableAttached()
  77. {
  78. }
  79. @Override
  80. public void onDrawableDetached()
  81. {
  82. }
  83. }

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获取到相关信息。