自定义适配器

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:图片异步拉取回调。
  • paramObject:一些特殊场景定制参数,正常情况下无需关注。

示例如下:

  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等图片拉取场景会调用此接口。参数:urlString : 图片地址或者base64信息。paramObject:一些特殊场景定制参数,正常情况下无需关注。示例如下:

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