You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by so...@apache.org on 2017/08/01 07:56:02 UTC

[2/3] incubator-weex git commit: * [android] use ThreadExecutor to manage work thread

* [android] use ThreadExecutor to manage work thread


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/75414781
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/75414781
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/75414781

Branch: refs/heads/0.16-dev
Commit: 754147818a02704c8fb8fac9a4991ea4d1c692a4
Parents: c4cec2b
Author: miomin <69...@qq.com>
Authored: Tue Aug 1 15:31:47 2017 +0800
Committer: miomin <69...@qq.com>
Committed: Tue Aug 1 15:31:47 2017 +0800

----------------------------------------------------------------------
 .../java/com/alibaba/weex/IndexActivity.java    | 14 ++++++
 .../main/java/com/taobao/weex/WXSDKManager.java | 10 ++++
 .../taobao/weex/common/WXWorkThreadManager.java | 48 ++++++++++++++++++++
 .../com/taobao/weex/ui/component/WXImage.java   | 11 ++++-
 .../taobao/weex/utils/WXViewToImageUtil.java    | 23 +++-------
 5 files changed, 89 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/75414781/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java b/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
index 8469b26..866733a 100644
--- a/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
+++ b/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
@@ -51,6 +51,7 @@ public class IndexActivity extends AbstractWeexActivity {
 
   private static final String TAG = "IndexActivity";
   private static final int CAMERA_PERMISSION_REQUEST_CODE = 0x1;
+  private static final int WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 0x2;
   private static final String DEFAULT_IP = "your_current_IP";
   private static String sCurrentIp = DEFAULT_IP; // your_current_IP
 
@@ -102,6 +103,18 @@ public class IndexActivity extends AbstractWeexActivity {
     };
 
     LocalBroadcastManager.getInstance(this).registerReceiver(mReloadReceiver, new IntentFilter(WXSDKEngine.JS_FRAMEWORK_RELOAD));
+
+    requestWeexPermission();
+  }
+
+  private void requestWeexPermission() {
+    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
+      if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+        Toast.makeText(this, "please give me the permission", Toast.LENGTH_SHORT).show();
+      } else {
+        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE);
+      }
+    }
   }
 
   @Override
@@ -147,6 +160,7 @@ public class IndexActivity extends AbstractWeexActivity {
     super.onRequestPermissionsResult(requestCode, permissions, grantResults);
     if (requestCode == CAMERA_PERMISSION_REQUEST_CODE && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
       startActivity(new Intent(this, CaptureActivity.class));
+    } else if (requestCode == WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
     } else {
       Toast.makeText(this, "request camara permission fail!", Toast.LENGTH_SHORT).show();
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/75414781/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
index 0b43fa6..4e144e0 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
@@ -45,6 +45,7 @@ import com.taobao.weex.bridge.WXValidateProcessor;
 import com.taobao.weex.common.WXRefreshData;
 import com.taobao.weex.common.WXRuntimeException;
 import com.taobao.weex.common.WXThread;
+import com.taobao.weex.common.WXWorkThreadManager;
 import com.taobao.weex.dom.WXDomManager;
 import com.taobao.weex.ui.WXRenderManager;
 import com.taobao.weex.utils.WXLogUtils;
@@ -64,6 +65,7 @@ public class WXSDKManager {
   private static volatile WXSDKManager sManager;
   private static AtomicInteger sInstanceId = new AtomicInteger(0);
   private final WXDomManager mWXDomManager;
+  private final WXWorkThreadManager mWXWorkThreadManager;
   private WXBridgeManager mBridgeManager;
   /** package **/ WXRenderManager mWXRenderManager;
 
@@ -97,6 +99,7 @@ public class WXSDKManager {
     mWXRenderManager = renderManager;
     mWXDomManager = new WXDomManager(mWXRenderManager);
     mBridgeManager = WXBridgeManager.getInstance();
+    mWXWorkThreadManager = new WXWorkThreadManager();
   }
 
   /**
@@ -195,6 +198,10 @@ public class WXSDKManager {
     return mWXRenderManager;
   }
 
+  public WXWorkThreadManager getWXWorkThreadManager() {
+    return mWXWorkThreadManager;
+  }
+
   public @Nullable WXSDKInstance getSDKInstance(String instanceId) {
     return instanceId == null? null : mWXRenderManager.getWXSDKInstance(instanceId);
   }
@@ -207,6 +214,9 @@ public class WXSDKManager {
     if (mWXDomManager != null) {
       mWXDomManager.destroy();
     }
+    if (mWXWorkThreadManager != null) {
+      mWXWorkThreadManager.destroy();
+    }
   }
 
   @Deprecated

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/75414781/android/sdk/src/main/java/com/taobao/weex/common/WXWorkThreadManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXWorkThreadManager.java b/android/sdk/src/main/java/com/taobao/weex/common/WXWorkThreadManager.java
new file mode 100644
index 0000000..3510d54
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXWorkThreadManager.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.taobao.weex.common;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * Class for managing work thread
+ */
+public final class WXWorkThreadManager {
+
+  private ExecutorService singleThreadExecutor;
+
+  public WXWorkThreadManager() {
+    singleThreadExecutor = Executors.newSingleThreadExecutor();
+  }
+
+  public void post(Runnable task) {
+    if (singleThreadExecutor != null)
+      singleThreadExecutor.execute(task);
+  }
+
+  /**
+   * Destroy current instance
+   */
+  public void destroy() {
+    if (singleThreadExecutor != null)
+      singleThreadExecutor.shutdown();
+    singleThreadExecutor = null;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/75414781/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
index 1820989..db58d99 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
@@ -70,7 +70,6 @@ import java.util.Map;
 public class WXImage extends WXComponent<ImageView> {
 
   public static final String SUCCEED = "success";
-  public static final String PATH = "path";
   public static final String ERRORDESC = "errorDesc";
 
   private String mSrc;
@@ -369,6 +368,16 @@ public class WXImage extends WXComponent<ImageView> {
       return;
     }
 
+    if (mSrc == null || mSrc.equals("")) {
+      if (saveStatuCallback != null) {
+        Map<String, Object> result = new HashMap<>();
+        result.put(SUCCEED, false);
+        result.put(ERRORDESC,"Image does not have the correct src");
+        saveStatuCallback.invoke(result);
+      }
+      return;
+    }
+
     WXViewToImageUtil.generateImage(mHost, 0, 0xfff8f8f8, new WXViewToImageUtil.OnImageSavedCallback() {
       @Override
       public void onSaveSucceed(String path) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/75414781/android/sdk/src/main/java/com/taobao/weex/utils/WXViewToImageUtil.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXViewToImageUtil.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXViewToImageUtil.java
index df34a26..b486fb5 100755
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXViewToImageUtil.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXViewToImageUtil.java
@@ -29,6 +29,9 @@ import android.os.Looper;
 import android.provider.MediaStore;
 import android.support.annotation.ColorInt;
 import android.view.View;
+
+import com.taobao.weex.WXSDKManager;
+
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -42,11 +45,6 @@ public class WXViewToImageUtil {
     public static int mBackgroundColor = Color.TRANSPARENT;
 
     /**
-     * Use this variable to ensure that only one save image task occurs at the same time
-     */
-    private static boolean isSaving = false;
-
-    /**
      * Generate image and return path via callback
      */
     public static void generateImage(final View imageView, final int width,
@@ -54,18 +52,12 @@ public class WXViewToImageUtil {
 
         mBackgroundColor = backgroundColor;
 
-        // The new task can not be triggered until the last task completes
-        if (isSaving) {
-            return;
-        }
-        isSaving = true;
-
         // Only one save image task occurs at the same time
-        new Thread(new Runnable() {
+        WXSDKManager.getInstance().getWXWorkThreadManager().post(new Thread(new Runnable() {
             @Override
             public void run() {
                 // Generate bitmap from ImageView
-                Bitmap bitmap = getImageViewToBitmap(imageView, width);
+                Bitmap bitmap = getBitmapFromImageView(imageView, width);
 
                 if (bitmap == null) {
                     if (mOnImageSavedCallback != null) {
@@ -86,9 +78,8 @@ public class WXViewToImageUtil {
                         }
                     }
                 });
-                isSaving = false;
             }
-        }).start();
+        }));
     }
 
     /**
@@ -146,7 +137,7 @@ public class WXViewToImageUtil {
     /**
      * Get bitmap from imageview
      */
-    public static Bitmap getImageViewToBitmap(final View view, int width) {
+    public static Bitmap getBitmapFromImageView(final View view, int width) {
         if (view.getWidth() <= 0 || view.getHeight() <= 0) {
             view.measure(View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY),
                     View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));