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也類似處理了吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM