2013-11-15 3 views
0

인터넷이 오프라인 일 때 응용 프로그램을 실행할 때 대화 상자를 표시하도록 구현 중이며 버튼을 클릭하면 응용 프로그램이 충돌 할 때 "치명적인 예외가 발생했습니다"및 ClassCastException이 발생합니다. 누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까? 고급에서 당신에게 감사합니다. 여기 안드로이드에서 인터넷 연결 확인을위한 대화 상자 만들기

내가 인터넷이 활성화되어 있는지 확인 여부를 어떻게 코드 :

public class AndroidDetectInternetConnectionActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Button btnStatus = (Button) findViewById(R.id.btn_check); 

     btnStatus.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 


       if (!isOnline()) 
       { 
        showNoConnectionDialog(this); 

       } 
      } 

     }); 

    } 

    public static void showNoConnectionDialog(OnClickListener onClickListener) 
    { 
     final Context ctx = (Context) onClickListener; 
     AlertDialog.Builder builder = new AlertDialog.Builder(ctx); 
     builder.setCancelable(true); 
     builder.setMessage(R.string.no_connection); 
     builder.setTitle(R.string.no_connection_title); 
     builder.setPositiveButton(R.string.settings_button_text, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) 
      { 

       ctx.startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS)); 
      } 
     }); 

     builder.setNegativeButton(R.string.cancel_button_text, new DialogInterface.OnClickListener() 
     { 
      public void onClick(DialogInterface dialog, int which) 
      { 
       return; 
      } 
     }); 

     builder.setOnCancelListener(new DialogInterface.OnCancelListener() 
     { 
      public void onCancel(DialogInterface dialog) { 
       return; 
      } 
     }); 

     builder.show(); 
    } 

    public boolean isOnline() 
    { 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
     if (netInfo != null && netInfo.isConnectedOrConnecting()) 
     { 
      return true; 
     } 
     return false; 
    } 

} 

//이 내 로그 고양이 스택 추적

11-15 11:57:19.115: D/AndroidRuntime(453): Shutting down VM 
11-15 11:57:19.115: W/dalvikvm(453): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
11-15 11:57:19.122: E/AndroidRuntime(453): FATAL EXCEPTION: main 
11-15 11:57:19.122: E/AndroidRuntime(453): java.lang.ClassCastException: com.example.detectinternetconnection.AndroidDetectInternetConnectionActivity$1 
11-15 11:57:19.122: E/AndroidRuntime(453): at com.example.detectinternetconnection.AndroidDetectInternetConnectionActivity.showNoConnectionDialog(AndroidDetectInternetConnectionActivity.java:99) 
11-15 11:57:19.122: E/AndroidRuntime(453): at com.example.detectinternetconnection.AndroidDetectInternetConnectionActivity$1.onClick(AndroidDetectInternetConnectionActivity.java:64) 
11-15 11:57:19.122: E/AndroidRuntime(453): at android.view.View.performClick(View.java:2485) 
11-15 11:57:19.122: E/AndroidRuntime(453): at android.view.View$PerformClick.run(View.java:9080) 
11-15 11:57:19.122: E/AndroidRuntime(453): at android.os.Handler.handleCallback(Handler.java:587) 
11-15 11:57:19.122: E/AndroidRuntime(453): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-15 11:57:19.122: E/AndroidRuntime(453): at android.os.Looper.loop(Looper.java:123) 
11-15 11:57:19.122: E/AndroidRuntime(453): at android.app.ActivityThread.main(ActivityThread.java:3683) 
11-15 11:57:19.122: E/AndroidRuntime(453): at java.lang.reflect.Method.invokeNative(Native Method) 
11-15 11:57:19.122: E/AndroidRuntime(453): at java.lang.reflect.Method.invoke(Method.java:507) 
11-15 11:57:19.122: E/AndroidRuntime(453): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
11-15 11:57:19.122: E/AndroidRuntime(453): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
11-15 11:57:19.122: E/AndroidRuntime(453): at dalvik.system.NativeStart.main(Native Method) 
11-15 11:57:24.892: I/Process(453): Sending signal. PID: 453 SIG: 9 

답변

2

변경이 줄을

final Context ctx = (Context) onClickListener; 

하는 것입니다 아래 하나

final Context ctx = AndroidDetectInternetConnectionActivity.this; 

기본적으로 Context에 대해 onClickListener를 컨버팅하려고합니다.이 컨텍스트는 올바르지 않으며 캐스팅 될 수 없습니다. 컨텍스트 인스턴스가 필요한 곳에서 ActivityName.this을 직접 사용하거나 static Context ctx을 클래스 변수로 정의하고이 라인을 추가하여 onCreate()에 초기화하십시오. ctx =this도 사용하기 전에 초기화하십시오.

+0

public void showNoConnectionDialog() { Context ctx = AndroidDetectInternetConnectionActivity.this tazeenmulani

+0

편집 된 대답에서 제안한 것을 사용합니다. 더 잘 이해할 수 있도록 굵게 표시했습니다. – AAnkit

+0

여전히 동일한 오류가 발생했습니다. – tazeenmulani

0

당신은 기본적인 문제는 선으로 생성 즐기십시오 :

최종 컨텍스트 CTX = (컨텍스트) OnClickListener를을;

이것은 단순히 컨텍스트가 아니므로 강제로 시도하지 않으므로 작동하지 않습니다.

난 당신이하고 싶었던 것을 믿는다는 가장 쉬운 해결책은 간단하게하는 것입니다

(당신이 지금 통과하고있는 지역의 이름이 OnClickListener를 클래스 반대)하지 패스이 기능에 컨텍스트 (또는 활동)을 통과했다 아무것도 생성자에 보내고 AndroidDetectInternetConnectionActivity.this를 사용하여 유효한 컨텍스트에 액세스하십시오.

2

이 문제를 해결하는 방법에는 두 가지가 있습니다. 나중에

1) showNoConnectionDialog(this);과 : public static void showNoConnectionDialog(Context ctx) ...

2) showNoConnectionDialog(); 나중에 ". 정적 맥락에서이를 사용할 수 없습니다"나는 당신의 코드 라인을 사용하지만 보여줍니다

관련 문제