zoukankan      html  css  js  c++  java
  • umeng社交分享最新版5.0的跨进程使用崩溃的问题及解法-Android

    先简单介绍下5.0版的变化。5.0最大的特色是调用简单,采用了链式语法,形如:

    new ShareAction(context).setPlatform(share_media)
            .withText(content).withTitle(title)
            .withMedia(icon)
            .withTargetUrl(url)
            .share();

    其次,API更加灵活,支持分享按钮的点击回调;
    最后,采用了最新的sdk(新浪微博原生体验更好、支持易信)。


    但是有一个很大的问题,那就是当分享代码不在默认的进程(以下称main进程)里时,回调会报空指针异常。

    比如在AndroidManifest.xml新开了一个进程用来打开h5页面,点了微信分享,然后点取消,从微信返回APP的时候就报空指针异常崩溃了(别和我说你不知道新开进程的好处和意义,看我微信朋友圈1月4日分享的《微信客户端架构演进之路》吧)。AndroidManifest.xml的配置如下,关键是红色代码部分新开了一个叫tools的进程:

    <activity
        android:name=".ACWebview"
        android:process=":tools"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="makai" />
        </intent-filter>
    </activity>

    崩溃日志如下:

    复制代码
    java.lang.RuntimeException:Unable to start activity ComponentInfo{com.xxx/com.xxx.wxapi.WXEntryActivity}: java.lang.NullPointerException
    android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2189)
    ......
    cause by:
    java.lang.NullPointerException:
    com.umeng.socialize.handler.UMWXHandler.onShareCallback(UMWXHandler.java:462)
    com.umeng.socialize.handler.UMWXHandler$5.onResp(UMWXHandler.java:487)
    com.umeng.socialize.weixin.view.WXCallbackActivity.onResp(WXCallbackActivity.java:52)
    com.tencent.mm.sdk.openapi.WXApiImplV10.handleIntent(Unknown Source)
    com.umeng.socialize.weixin.view.WXCallbackActivity.onCreate(WXCallbackActivity.java:30)
    android.app.Activity.performCreate(Activity.java:5251)
    android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153)
    android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2238)
    android.app.ActivityThread.access$800(ActivityThread.java:138)
    android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201)
    android.os.Handler.dispatchMessage(Handler.java:102)
    android.os.Looper.loop(Looper.java:136)
    android.app.ActivityThread.main(ActivityThread.java:5016)
    java.lang.reflect.Method.invokeNative(Native Method)
    java.lang.reflect.Method.invoke(Method.java:515)
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
    dalvik.system.NativeStart.main(Native Method)
    复制代码

    根据上面的日志,空指针异常的原因是UMWXHandler.java的回调umShareListener为null(如下图,至于为什么是null,因为sdk不是我们写的,无法从sdk层面去解决故没有去深究,但我们要从应用层面去解决问题):


    进一步分析日志,发现入口是
    com.umeng.socialize.weixin.view.WXCallbackActivity.onCreate(WXCallbackActivity.java:30)

    想起我们工程里有一个叫WXEntryActivity.java的继承了它,既然是onCreate报的异常,那可以try catch捕捉这个异常以防止崩溃。说干就干,代码如下:

    复制代码
    import android.os.Bundle;
    
    import com.umeng.socialize.weixin.view.WXCallbackActivity;
    
    public class WXEntryActivity extends WXCallbackActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            try {
                super.onCreate(savedInstanceState);
            }catch (Exception e){
                finish();
            }
        }
    }
    复制代码

    由此跨进程调用分享取消时崩溃的问题解决了。

    同理微博的那个WBShareActivity.java也类似处理了吧。

  • 相关阅读:
    [Spring cloud 一步步实现广告系统] 5. 投放系统配置+启动+实体类
    [Spring cloud 一步步实现广告系统] 4. 通用代码模块设计
    [Spring cloud 一步步实现广告系统] 3. 网关路由
    [Spring cloud 一步步实现广告系统] 1. 业务架构分析
    [Spring cloud 一步步实现广告系统] 2. 配置&Eureka服务
    [Java 开发利器Lombok] 常用注解演示
    使用maven快速入门
    [Spring-Cloud-Alibaba] Sentinel 规则持久化
    Java 类加载之匿名类和主类相互依赖问题
    [Spring-Cloud-Alibaba] Sentinel 整合RestTemplate & Feign
  • 原文地址:https://www.cnblogs.com/ldq2016/p/6046819.html
Copyright © 2011-2022 走看看