2016-03-10 7 views
1

Я использовал this Руководство AdMob для добавления рекламного объявления в мое приложение. Приложение имеет MainActivity с WebView для обработки игры-головоломки, а также верхнюю панель и навигационный ящик для обработки навигации.Android WebView исчезает после закрытия межстраничного видеообъявления

Интерстициальные работы прекрасно подходят для текстовых и графических объявлений, но не для видеообъявлений. После закрытия видеообъявления WebView исчез (верхняя панель и навигационный ящик все еще там). Если я после этого нажмите на пункт меню в панели навигации, которые должны ориентироваться на новую страницу в WebView, приложение падает со следующим NullPointerException (проверено на Android 4.2 и 6.0 устройства):

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.webkit.WebView.loadUrl(java.lang.String)' on a null object reference 
    at com.bd.test.MainActivity.k(Unknown Source) 
    at com.bd.test.MainActivity.a(Unknown Source) 
    at android.support.design.widget.aa.a(Unknown Source) 
    at android.support.v7.view.menu.i.a(Unknown Source) 
    at android.support.v7.view.menu.m.b(Unknown Source) 
    at android.support.v7.view.menu.i.a(Unknown Source) 
    at android.support.design.internal.d.onClick(Unknown Source) 
    at android.view.View.performClick(View.java:5198) 
    at android.view.View$PerformClick.run(View.java:21147) 
    at android.os.Handler.handleCallback(Handler.java:742) 
    at android.os.Handler.dispatchMessage(Handler.java:97) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5457) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

С помощью меню item click handler вызывает функцию loadUrl моего WebView объекта mWebView, который как-то установлен на null при показе или закрытии межстраничного видеообъявления.

Могут ли быть помехи между двумя WebView; моя и та, которая показывает объявление межстраничного объявления (похожее на то, что раньше было observed).

Или я просто ошибаюсь в своем коде? Соответствующие части моего MainActivity приведены ниже:

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 

    protected WebView mWebView; 
    protected InterstitialAd mInterstitialAd; 

    protected int pageId = R.id.nav_home; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //initToolbar(); 
     //initDrawer(); 
     //initNavigationView(); 

     initAdInterstitial(); 

     if (savedInstanceState != null) { 
      return; 
     } 

     initWebView(); 
     navigate(); 
    } 

    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     pageId = item.getItemId(); 
     navigate(); 
     return true; 
    } 

    protected void navigate() { 

     // Close drawer if it is open. 
     if(mDrawer.isDrawerOpen(GravityCompat.START)) { 
      mDrawer.closeDrawer(GravityCompat.START); 
     } 

     if(pageId == R.id.nav_home) { 
      mWebView.loadUrl(URL_INDEX); 
     } 
     else if(pageId == R.id.nav_level0) { 
      mWebView.loadUrl(getLevelUrl(0)); 
     } 
     else if(pageId == R.id.nav_level1) { 
      mWebView.loadUrl(getLevelUrl(1)); 
     } 
     else if(pageId == R.id.nav_level2) { 
      mWebView.loadUrl(getLevelUrl(2)); 
     } 
     else if(pageId == R.id.nav_level3) { 
      mWebView.loadUrl(getLevelUrl(3)); 
     } 
     else if(pageId == R.id.nav_history) { 
      mWebView.loadUrl(URL_LAST_PLAYED); 
     } 
    } 

    protected void initWebView() { 

     mWebView = (WebView) findViewById(R.id.webview); 

     // Enable Javascript 
     WebSettings webSettings = mWebView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 
     webSettings.setDomStorageEnabled(true); 
     webSettings.setDatabaseEnabled(true); 
     webSettings.setAllowUniversalAccessFromFileURLs(true); 
     webSettings.setDefaultTextEncodingName("utf-8"); 

     // Deprecated. 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
      Context c = mWebView.getContext(); 
      webSettings.setDatabasePath(c.getFilesDir().getPath() + c.getPackageName() + 
        "/databases/"); 
     } 

     mWebView.setWebViewClient(new WebViewClient() { 

      /* 
      * HERE IS WHERE THE INTERSTITIAL AD IS SHOWN. 
      * 
      * Shows the interstitial ad every n-th page load. 
      */ 
      public void onPageFinished(WebView view, String url) { 

       // After WebView page is loaded: 

       // Update page load count. 
       navigationCount = (navigationCount + 1) % adFrequency; 

       // Show ad once every n-th page load. 
       if(navigationCount == 0) { 
        showAd(); 
       } 
      } 
     }); 
    } 

    protected void initAdInterstitial() { 
     mInterstitialAd = new InterstitialAd(this); 
     mInterstitialAd.setAdUnitId(getString(R.string.interstitial_ad_unit_id)); 

     mInterstitialAd.setAdListener(new AdListener() { 
      @Override 
      public void onAdClosed() { 
       requestNewInterstitial(); 
      } 
     }); 
     requestNewInterstitial(); 
    } 

    protected void requestNewInterstitial() { 
     AdRequest adRequest = new AdRequest.Builder().build(); 
     mInterstitialAd.loadAd(adRequest); 
    } 

    public void showAd() { 
     if (mInterstitialAd.isLoaded()) { 
      mInterstitialAd.show(); 
     } 
    } 
} 

ответ

2

Я подозреваю, что это из-за этой линии в onCreate()

if (savedInstanceState != null) { 
      return; 
     } 

Когда вы вернетесь к вашей деятельности вы будете иметь не нулевое savedInstanceState так никогда не будет инициализируйте свой WebView.

NB Это помогает, если вы де-зафускируете свои стеки или публикуете источник с номерами строк.

+0

Я знаю, я попытался получить обфускацию stacktrace, но у меня никогда не было рекламного объявления на моей де-запутанной отладочной версии (только текст и изображение, тогда он отлично работает). Поэтому в настоящее время у меня есть только стек из обфускационной версии. Но с объяснением, которое я надеялся, было ясно, что переменная mWebView имеет значение null, когда loadUrl вызывается в навигационной функции. –

+0

И вы, скорее всего, правы в файле savedInstanceState (я забыл, что немного, вставил if-statement на основе некоторой документации по фрагментам, но забыл обновить его впоследствии). Я могу только проверить это позже сегодня или завтра, я отвечу на ответ позже. –

+0

Вы действительно были правы. Потребовалось много времени, прежде чем появилось видеообъявление, но это, наконец, произошло, и это сработало! Спасибо, Уильям! –

Смежные вопросы