ユーザーがアプリのアイコンをクリックしたときに、アプリが最初にデバイスがインターネットに接続されているかどうかを確認し、次に、受信した結果に応じて何かを実行します(デバイスが接続されているかどうか)。だから私はこのコードを書きました:
public class MainActivity extends Activity {
// SOME CONSTANTS WILL BE DEFINED HERE
AlertDialog.Builder builder = new AlertDialog.Builder(this);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.icoMyIcon).setOnClickListener(listener);
}
private OnClickListener listener = new OnClickListener() {
public void onClick(View v) {
if (isNetworkConnected()) {
builder.setMessage("Internet connected!").setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
} else {
builder.setMessage("Internet isn\'t connected!")
.setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
}
}
};
// Check if the device is connected to the Internet
private boolean isNetworkConnected() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni == null) {
// There are no active networks.
return false;
} else
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
エミュレータでこのアプリを実行しようとすると、アプリがクラッシュし続け、LogCatに次のエラーメッセージが表示されます。
07-24 22:59:45.034: E/AndroidRuntime(894): FATAL EXCEPTION: main
07-24 22:59:45.034: E/AndroidRuntime(894): Java.lang.RuntimeException: Unable to
instantiate activity ComponentInfo{com.my.app/com.my.app.MainActivity}:
Java.lang.IllegalStateException: System services not available to Activities before onCreate()
07-24 22:59:45.034: E/AndroidRuntime(894): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2585)
07-24 22:59:45.034: E/AndroidRuntime(894): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2679)
07-24 22:59:45.034: E/AndroidRuntime(894): at Android.app.ActivityThread.access$2300(ActivityThread.Java:125)
07-24 22:59:45.034: E/AndroidRuntime(894): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:2033)
07-24 22:59:45.034: E/AndroidRuntime(894): at Android.os.Handler.dispatchMessage(Handler.Java:99)
07-24 22:59:45.034: E/AndroidRuntime(894): at Android.os.Looper.loop(Looper.Java:123)
07-24 22:59:45.034: E/AndroidRuntime(894): at Android.app.ActivityThread.main(ActivityThread.Java:4627)
07-24 22:59:45.034: E/AndroidRuntime(894): at Java.lang.reflect.Method.invokeNative(Native Method)
07-24 22:59:45.034: E/AndroidRuntime(894): at Java.lang.reflect.Method.invoke(Method.Java:521)
07-24 22:59:45.034: E/AndroidRuntime(894): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:868)
07-24 22:59:45.034: E/AndroidRuntime(894): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:626)
07-24 22:59:45.034: E/AndroidRuntime(894): at dalvik.system.NativeStart.main(Native Method)
07-24 22:59:45.034: E/AndroidRuntime(894): Caused by: Java.lang.IllegalStateException: System services not available to Activities before onCreate()
07-24 22:59:45.034: E/AndroidRuntime(894): at Android.app.Activity.getSystemService(Activity.Java:3526)
07-24 22:59:45.034: E/AndroidRuntime(894): at com.Android.internal.app.AlertController$AlertParams.<init>(AlertController.Java:743)
07-24 22:59:45.034: E/AndroidRuntime(894): at Android.app.AlertDialog$Builder.<init>(AlertDialog.Java:273)
07-24 22:59:45.034: E/AndroidRuntime(894): at com.my.app.MainActivity.<init>(MainActivity.Java:24)
07-24 22:59:45.034: E/AndroidRuntime(894): at Java.lang.Class.newInstanceImpl(Native Method)
07-24 22:59:45.034: E/AndroidRuntime(894): at Java.lang.Class.newInstance(Class.Java:1429)
07-24 22:59:45.034: E/AndroidRuntime(894): at Android.app.Instrumentation.newActivity(Instrumentation.Java:1021)
07-24 22:59:45.034: E/AndroidRuntime(894): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2577)
07-24 22:59:45.034: E/AndroidRuntime(894): ... 11 more
なぜそれが起こっているのですか、どうすれば修正できますか?初心者なので優しくしてください! :)
On createの前にonClickリスナーをインスタンス化することが呼び出されたためだと思います。 onCreate()
メソッド内でonClickリスナーをインスタンス化してみてください。
これはAlertDialog
の場合もそうでない場合もありますが、完全にはわかりません。
技術的には、問題を引き起こすのは次の行だと思います。
_ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
_
ただし、これはisNetworkConnected()
メソッド内で呼び出されているため、onClickメソッド内で呼び出されるため、onClickのインスタンス化を移動すると問題が解決します。
手がかりは例外ですonCreate()より前のアクティビティではシステムサービスを利用できません
エラーは、このオブジェクトの作成によるものです。
AlertDialog.Builder builder = new AlertDialog.Builder(this);
これは、onCreateが呼び出された後に行う必要があります。
システムサービスを呼び出すには、実行中のアクティビティを使用する必要があります。つまり、onCreate
に継承されたsuper
メソッドを実行する必要があります。そのため、現在のアプリケーションコンテキストを使用してシステムサービスを呼び出す必要があることを識別します。
使用する
ConnectivityManager cm = (ConnectivityManager) getBaseContext().getSystemService(Context.CONNECTIVITY_SERVICE);
または、context
を参照するContext
オブジェクトがある場合、以下のように使用できます
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
次の権限をAndroidManifest.xmlファイルに追加します。
この許可を追加するのを忘れていると思います。
Android.permission.ACCESS_NETWORK_STATE
それはあなたを助けます。
問題は、「リスナー」をグローバル変数として定義することです。エラーメッセージで指定されているため:onCreate()の前のアクティビティでシステムサービスを利用できません。
OnCreateメソッドは次のようになります。
private OnClickListener listener = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listener = new OnClickListener() {
public void onClick(View v) {
if (isNetworkConnected()) {
builder.setMessage("Internet connected!").setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
} else {
builder.setMessage("Internet isn\'t connected!")
.setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
}
}
};
findViewById(R.id.icoMyIcon).setOnClickListener(listener);
}
正解は
AlertDialog.Builder builder = new AlertDialog.Builder(this);
これはjeetによってすでに言及されており、理由は、論理的に正しくないアクティビティコンテキストで実行されるアクティビティのライフサイクルメソッドの前にAlertDialogを初期化したためです。
そしてあなたの問題の解決策は
プライベートOnClickListenerリスナー=新しいOnClickListener(){
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
if (isNetworkConnected()) {
builder.setMessage("Internet connected!").setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
} else {
builder.setMessage("Internet isn\'t connected!")
.setCancelable(false)
.setPositiveButton("OK", null);
builder.create().show();
}
}
};
アラートダイアログを表示する必要があるときに初期化します。この古いスレッドに回答を投稿する理由は受け入れられた回答であり、onClickリスナーをonCreate()から移動してもJeetの回答は問題を解決しませんでしたが、問題は同じです。
今日、kotlinで同じ問題に遭遇しました。インターネットが利用できない場合、エラーダイアログが表示され、私の愚かな間違いが
コンテキストを「これ」として渡す代わりに、MainActivity()として渡しました
正しいR.string.error.errorDialog(this)//
間違ったR.string.error.errorDialog(MainActivity())
私の場合、エラーメッセージが表示されました:「onCreate()以前のアクティビティでシステムサービスを利用できません」
以下のようなコンテキストを使用してクラスプロパティを初期化すると
class MainActivity : AppCompatActivity() {
// this line below
private val notificationManager: NotificationManagerCompat = NotificationManagerCompat.from(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
また、_class MyAdapter extends ArrayAdapter<myModel>
_などの内部クラスがある場合、それは役立ちます[〜#〜]ない[〜#〜]それをインスタンス化するMyAdapter = new mAdapter<mModel>()
)---(beforeアクティビティのonCreate()
。