添加AdMob横幅广告后Android VPN应用崩溃问题求助
问题描述
我开发一款VPN应用时,每次集成广告都出问题。之前还能修复一些,但这次彻底搞不定——尝试了6次集成广告,启动应用就崩溃。我是Android开发和Android Studio新手,出现这种情况也正常。
崩溃日志
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.pronner.ragtagvpn, PID: 5295 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pronner.ragtagvpn/com.pronner.ragtagvpn.view.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.ads.AdView.loadAd(com.google.android.gms.ads.AdRequest)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3676) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3813) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2308) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7898) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.ads.AdView.loadAd(com.google.android.gms.ads.AdRequest)' on a null object reference at com.pronner.ragtagvpn.view.MainActivity.onCreate(MainActivity.java:62) at android.app.Activity.performCreate(Activity.java:8290) at android.app.Activity.performCreate(Activity.java:8269) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1384) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3657) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3813) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2308) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7898) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
MainActivity.java 的 onCreate 方法
package com.pronner.ragtagvpn.view; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageButton; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdView; import com.pronner.ragtagvpn.R; import com.pronner.ragtagvpn.Utils; import com.pronner.ragtagvpn.adapter.ServerListRVAdapter; import com.pronner.ragtagvpn.interfaces.ChangeServer; import com.pronner.ragtagvpn.interfaces.NavItemClickListener; import com.pronner.ragtagvpn.model.Server; import com.google.android.gms.ads.MobileAds; import com.google.android.gms.ads.initialization.InitializationStatus; import com.google.android.gms.ads.initialization.OnInitializationCompleteListener; import java.util.ArrayList; public class MainActivity extends AppCompatActivity implements NavItemClickListener { private FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); private Fragment fragment; private RecyclerView serverListRv; private ArrayList<Server> serverLists; private ServerListRVAdapter serverListRVAdapter; private DrawerLayout drawer; private ChangeServer changeServer; public static final String TAG = "RagTagVPN"; private AdView mAdView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MobileAds.initialize(this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(InitializationStatus initializationStatus) { } }); mAdView = findViewById(R.id.adView); AdRequest adRequest = new AdRequest.Builder().build(); mAdView.loadAd(adRequest); // Initialize all variable initializeAll(); ImageButton menuRight = findViewById(R.id.navbar_right); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayShowTitleEnabled(false); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); menuRight.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { closeDrawer(); } }); transaction.add(R.id.container, fragment); transaction.commit(); // Server List recycler view initialize if (serverLists != null) { serverListRVAdapter = new ServerListRVAdapter(serverLists, this); serverListRv.setAdapter(serverListRVAdapter); } }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.pronner.ragtagvpn"> <queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https" /> </intent> <intent> <action android:name="android.intent.action.DIAL" /> <data android:scheme="tel" /> </intent> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="*/*" /> </intent> </queries> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <application android:allowBackup="true" android:icon="@drawable/ragtag" android:label="RagTagVPN" android:extractNativeLibs="true" tools:replace="android:extractNativeLibs" android:roundIcon="@drawable/ragtag" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name="com.pronner.ragtagvpn.view.MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <action android:name="com.example.app.START_BACKGROUND" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-3940256099942544~3347511713"/> <activity android:name="de.blinkt.openvpn.DisconnectVPNActivity" android:excludeFromRecents="true" android:noHistory="true" android:taskAffinity=".DisconnectVPN" android:theme="@style/blinkt.dialog" /> <service android:name="de.blinkt.openvpn.core.OpenVPNService" android:permission="android.permission.BIND_VPN_SERVICE" android:exported="true"> <intent-filter> <action android:name="android.net.VpnService" /> </intent-filter> </service> </application> </manifest>
解决方案
崩溃核心原因:mAdView 为 null,调用 loadAd 触发空指针异常,按以下步骤修复:
1. 检查布局文件 activity_main.xml
确保布局中存在ID为adView的AdView组件(ID大小写敏感),正确配置示例:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ads="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 其他布局组件 --> <com.google.android.gms.ads.AdView android:id="@+id/adView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" ads:adSize="BANNER" ads:adUnitId="ca-app-pub-3940256099942544/6300978111"> <!-- 测试ID,上线替换为正式ID --> </com.google.android.gms.ads.AdView> </LinearLayout>
注意:根布局必须添加xmlns:ads="http://schemas.android.com/apk/res-auto"命名空间。
2. 规范广告加载时机
将广告加载逻辑移到MobileAds.initialize的完成回调中,同时增加空值判断:
MobileAds.initialize(this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(InitializationStatus initializationStatus) { mAdView = findViewById(R.id.adView); if (mAdView != null) { AdRequest adRequest = new AdRequest.Builder().build(); mAdView.loadAd(adRequest); } } });
3. 验证依赖配置
确保模块级build.gradle中已添加AdMob依赖(使用最新版本号):
dependencies { implementation 'com.google.android.gms:play-services-ads:22.6.0' }
内容的提问来源于stack exchange,提问作者ZiAD
相关产品推荐
相关产品推荐

