2014-12-02 2 views
2

내 응용 프로그램은 탐색 서랍을 사용하고 서랍에서 선택하면 내 주요 활동에서 조각을 바꿉니다. 나는 웹보기를 보여주는 두 조각을 가지고있다. 서랍을 열고 다른 항목을 선택하여 조각을 웹보기로 바꾸면 웹보기의 페이지가로드되기 전에 문제가 발생합니다. 이 경우 다음 오류가 발생합니다.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는 조각입니까? –

+0

WebView에서 코드를 제공 할 수 있습니까? – Anatol

+0

'super.onCreateView (...)'를 제거하면 어떻게됩니까? – Randy

답변

1

왜이 오류가 발생하는지 잘 모르겠지만 NullPointerException과 같아야합니다. 다음 시도 : Fragment 인스턴스에서 getActivity()을 호출 한 시간을 반환하십시오. 해당 조각에는 실제로이 활동이 있습니다.

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

이 시도하고있는 경우 말해 :

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

나는 것은 당신이 이런 일에 getActivity()를 호출하는 모든 코드를 교체해야합니다 : 귀하의 웹보기가이 함수를 호출로드 될 때 때문에 이 일.

+0

NullPointerException 인 경우 스택 추적은 NullPonterException을 말합니다. 치명적인 신호는 WebView에서 발생하는 것과 관련이 있습니다. 그것은 특정 기능을 호출 할 때 webview의 상태와 관련이있을 수 있습니다. 예를 들어 내 질문 (http://stackoverflow.com/questions/18755318/webview-destroy-causing-fatal-signal-11-crash)을 참조하십시오. 모든 WebView를 파기 한 후'WebStorage.getInstance(). deleteAllData()'를 호출 할 때 치명적인 신호를 보았습니다. 제 생각 엔이 사람이 비슷한 문제가 있습니다. – Randy

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(); 

의 조각이 실제로 활동에 연결되지 않은 경우 발생할 수 있습니다 귀하의 WebViewClient 구현에 "onReceivedError". 따라서 getActivity()가 유효한 값을 반환하지 않을 수 있습니다.

1

조각이 분리되면 webview를 파괴해야합니다.

분리 된 부분에있는 조각에서 webview.destroy()를 호출하십시오.

+0

이 답변에 적합해야합니다 ... – XcodeNOOB

관련 문제