2014-12-02 68 views
2

當抽屜中進行選擇時,我的應用程序使用導航抽屜並替換主要活動中的片段。我有幾個片段顯示Web視圖。如果我打開抽屜並選擇一個不同的項目,從而在Web視圖中的頁面加載完成之前用Web視圖替換片段,則會出現問題。發生這種情況時,出現此錯誤:在WebView加載之前替換片段時應用程序崩潰

12-02 08:07:48.605 11745-11745/kyfb.android.kyfb.com.kyfb A/chromium﹕ [FATAL:jni_android.cc(271)] Check failed: false. 
12-02 08:07:48.605 11745-11745/kyfb.android.kyfb.com.kyfb A/libc﹕ Fatal signal 6 (SIGABRT), code -6 in tid 11745 (d.kyfb.com.kyfb) 

這是帶有webview的片段之一。

public class AnnualMeetingFragment extends Fragment { 

    private WebView web; 
    private ProgressBar progressBar; 

    private String url; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     View rootView = inflater.inflate(R.layout.fragment_ag_facts, null); 

     url = "http://www.kyfbnewsroom.com/2013-kentucky-farm-bureau-annual-meeting-program/"; 

     web = (WebView)rootView.findViewById(R.id.web); 
     progressBar = (ProgressBar)rootView.findViewById(R.id.prgPageLoading); 

     web.getSettings().setDomStorageEnabled(true); 
     web.getSettings().setJavaScriptEnabled(true); 
     web.getSettings().setSupportZoom(true); 
     web.getSettings().setBuiltInZoomControls(true); 
     web.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); 
     web.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 
     web.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR); 

     web.loadUrl(url); 

     web.setWebChromeClient(new WebChromeClient() { 
      public void onProgressChanged(WebView webView, int progress) { 
       getActivity().setProgress(progress * 100); 
       progressBar.setProgress(progress); 
      } 
     }); 

     web.setWebViewClient(new WebViewClient() { 
      @Override 
      public void onPageStarted(WebView view, String url, Bitmap favicon) { 
       super.onPageStarted(web, url, favicon); 
       progressBar.setVisibility(View.VISIBLE); 
      } 

      @Override 
      public void onPageFinished(WebView view, String url) { 
       super.onPageFinished(web, url); 
       progressBar.setProgress(0); 
       progressBar.setVisibility(View.GONE); 
      } 

      public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
       Toast.makeText(getActivity(), description, Toast.LENGTH_SHORT).show(); 
      } 

      public boolean shouldOverrideUrlLoading(WebView view, String url) 
      { 


       if(url.endsWith(".mp4") || url.endsWith(".3gp") || url.endsWith(".avi") || url.endsWith(".flv")){ 
        Intent i = new Intent(Intent.ACTION_VIEW); 
        i.setData(Uri.parse(url)); 
        startActivity(i); //warning no error handling will cause force close if no media player on phone. 
        return true; 
       } 

       view.loadUrl(url); 
       return true; 
      } 
     }); 

     return rootView; 
    } 
} 
+0

webview是一個片段? – 2014-12-02 13:20:11

+0

你能用你的webView爲我們提供代碼嗎? – Anatol 2014-12-02 13:25:01

+0

當你移除'super.onCreateView(...)'時會發生什麼? – Randy 2014-12-02 13:47:24

回答

1

我不知道爲什麼你會得到這個錯誤,我認爲它應該是類似NullPointerException的東西。 嘗試下一個: Evert當你調用getActivity() Fragment實例你應該確定,該片段實際上有這個活動。因爲當你的WebView加載你調用這個函數:

web.setWebChromeClient(new WebChromeClient() { 
     public void onProgressChanged(WebView webView, int progress) { 
      getActivity().setProgress(progress * 100); 
      progressBar.setProgress(progress); 
     } 
    }); 

我的事情,你應該更換所有的代碼,你是在這樣的呼籲getActivity()

Activity activity = getActivity(); 
if (activity != null) { 
    // do something 
} 

試試這個,如果告訴我這項工作。

+0

如果是NullPointerException,那麼stacktrace會說NullPonterException。致命的信號與WebView中發生的事情有關。調用某個函數時,它可能與webview的狀態有關。例如看到我的問題(http://stackoverflow.com/questions/18755318/webview-destroy-causing-fatal-signal-11-crash)。在銷燬所有WebViews後調用'WebStorage.getInstance()。deleteAllData()'時,我有一個致命信號。我的猜測是這傢伙有類似的問題。 – Randy 2014-12-03 15:51:25

0

FragmentManager可能會保留可以通過標記鍵檢索到的舊片段。 進入具有正在進行替換的FragmentManager的活動。 進行替換時,使用標籤來標識片段。在進行替換之前,請檢查片段管理器是否已經包含具有該標記的片段,並使用該片段而不是創建新的片段實例。您的片段事務應該是這個樣子:

String fragTag = "FRAGMENT_1"; //Should be a class constant 
FragmentManager fm = getFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
Fragment fragment = fm.findFragmentByTag(fragTag); 
if(fragment == null) { 
    fragment = new AnnualMeetingFragment(); 
} 
ft.replace(R.id.container, fragment, fragTag); 
ft.commit(); 

此外,「onReceivedError」你WebViewClient實現時,這個片段沒有實際連接到活動可能發生。所以getActivity()可能不會返回有效值。

1

當片段被分離時,您應該銷燬webview。

從片段的分離方法調用webview.destroy()。

+0

這應該是正確的答案... – XcodeNOOB 2016-09-10 21:48:11

相關問題