Hanks10100 closed pull request #1607: make APP not crash when onRootCreated
called twice
URL: https://github.com/apache/incubator-weex/pull/1607
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index 475991efe0..7307a28edd 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -1379,6 +1379,9 @@ public void setBundleUrl(String url){
public void onRootCreated(WXComponent root) {
this.mRootComp = root;
+ if(root.getHostView().getParent()!=null && root.getHostView().getParent()
instanceof RenderContainer){
+
((RenderContainer)root.getHostView().getParent()).removeView(root.getHostView());
+ }
mRenderContainer.addView(root.getHostView());
setSize(mRenderContainer.getWidth(),mRenderContainer.getHeight());
}
diff --git
a/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java
b/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java
index 616e8c9e39..8cd1740ee6 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java
@@ -200,6 +200,9 @@ private static Object dispatchCallModuleMethod(@NonNull
WXSDKInstance instance,
}
}
+ public static WXModule findModule(String instanceId, String moduleStr) {
+ return findModule(instanceId, moduleStr, null);
+ }
private static WXModule findModule(String instanceId, String
moduleStr,ModuleFactory factory) {
@@ -217,6 +220,9 @@ private static WXModule findModule(String instanceId,
String moduleStr,ModuleFac
wxModule = moduleMap.get(moduleStr);
if (wxModule == null) {
try {
+ if (factory == null) {
+ factory = sModuleFactoryMap.get(moduleStr);
+ }
wxModule = factory.buildInstance();
wxModule.setModuleName(moduleStr);
} catch (Exception e) {
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXTextDomObject.java
b/android/sdk/src/main/java/com/taobao/weex/dom/WXTextDomObject.java
index 6bb1feba50..6ccd7030e4 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXTextDomObject.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXTextDomObject.java
@@ -558,12 +558,16 @@ private boolean warmUpTextLayoutCache(Layout layout) {
@Override
public void destroy() {
+ removeTypefaceObserver();
+ super.destroy();
+ }
+
+ private void removeTypefaceObserver() {
if (WXEnvironment.getApplication() != null && mTypefaceObserver != null) {
WXLogUtils.d("WXText", "Unregister the typeface observer");
LocalBroadcastManager.getInstance(WXEnvironment.getApplication()).unregisterReceiver(mTypefaceObserver);
mTypefaceObserver = null;
}
- super.destroy();
}
private void registerTypefaceObserverIfNeed(String desiredFontFamily) {
@@ -575,13 +579,14 @@ private void registerTypefaceObserverIfNeed(String
desiredFontFamily) {
return;
}
mFontFamily = desiredFontFamily;
- if (mTypefaceObserver != null) {
+ if (mTypefaceObserver != null || TypefaceUtil.isFontLoaded(mFontFamily)) {
return;
}
mTypefaceObserver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
+ removeTypefaceObserver();
String fontFamily = intent.getStringExtra("fontFamily");
if (!mFontFamily.equals(fontFamily)) {
return;
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/TypefaceUtil.java
b/android/sdk/src/main/java/com/taobao/weex/utils/TypefaceUtil.java
index 11f58cb0d7..d551c086e3 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/TypefaceUtil.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/TypefaceUtil.java
@@ -47,6 +47,12 @@
public static final String ACTION_TYPE_FACE_AVAILABLE =
"type_face_available";
+ public static boolean isFontLoaded(String fontFamily){
+ if(!sCacheMap.containsKey(fontFamily)) return false;
+ FontDO fontDO = sCacheMap.get(fontFamily);
+ return fontDO.getState() == FontDO.STATE_SUCCESS;
+ }
+
public static void putFontDO(FontDO fontDO) {
if (fontDO != null && !TextUtils.isEmpty(fontDO.getFontFamilyName())) {
sCacheMap.put(fontDO.getFontFamilyName(), fontDO);
@@ -112,7 +118,7 @@ public static Typeface getOrCreateTypeface(String family,
int style) {
return Typeface.create(family, style);
}
- private static void loadFromAsset(FontDO fontDo,String path){
+ private static void loadFromAsset(final FontDO fontDo,final String path){
try {
Typeface typeface =
Typeface.createFromAsset(WXEnvironment.getApplication().getAssets(), path);
if (typeface != null) {
@@ -124,6 +130,14 @@ private static void loadFromAsset(FontDO fontDo,String
path){
} else {
WXLogUtils.e(TAG, "Font asset file not found " + fontDo.getUrl());
}
+ WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(new
Runnable() {
+ @Override
+ public void run() {
+ Intent intent = new Intent(ACTION_TYPE_FACE_AVAILABLE);
+ intent.putExtra("fontFamily", fontDo.getFontFamilyName());
+
LocalBroadcastManager.getInstance(WXEnvironment.getApplication()).sendBroadcast(intent);
+ }
+ }, 100);
} catch (Exception e) {
WXLogUtils.e(TAG, e.toString());
}
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services