2012-07-25 45 views
9

Khi người dùng nhấn vào biểu tượng trong ứng dụng của tôi, trước tiên tôi muốn ứng dụng kiểm tra xem thiết bị có được kết nối với Internet hay không và sau đó thực hiện điều gì đó tùy thuộc vào kết quả nhận được (để biết nó chỉ xuất hiện một hộp thoại) thiết bị được kết nối hay không). Vì vậy, tôi đã viết mã này:"Dịch vụ hệ thống không có sẵn cho các Hoạt động trước khi khởi tạo()" Thông báo lỗi?

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; 
} 

} 

Khi tôi đang cố gắng để chạy ứng dụng này trên giả lập nó tiếp tục nghiền và tôi nhận được thông báo lỗi này trong 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 

Tại sao nó xảy ra và làm thế nào để sửa nó? Tôi là một người mới ở đây, vì vậy ... hãy nhẹ nhàng! :)

Trả lời

13

Tôi nghĩ rằng đó là vì bạn tạo một trình nghe onClick trước khi tạo được gọi. Thử khởi tạo trình nghe onClick bên trong phương thức onCreate().

Điều này cũng có thể xảy ra với trường hợp AlertDialog, nhưng tôi không hoàn toàn chắc chắn.

Về mặt kỹ thuật tôi tin rằng nó là dòng sau đó gây ra vấn đề:

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

Tuy nhiên, bởi vì đây được gọi là trong isNetworkConnected() phương pháp mà lần lượt được gọi là trong phương pháp onClick của bạn, di chuyển instantiation của onClick khắc phục sự cố.

Các đầu mối là trong ngoại lệ dịch vụ hệ thống không có sẵn để hoạt động trước khi onCreate()

+0

Yep, mà đã làm các trick! Và tôi đã nghĩ rằng vấn đề là với phương thức isNetworkConnected() ... Silly me. Cảm ơn nhiều! Tôi không thể nhấn nút "Chấp nhận" trong 7 phút nữa, nhưng sẽ thực hiện sau! Một lần nữa, cảm ơn bạn rất nhiều! – Igal

+0

Tôi vừa sửa lại một chút, đó là phương thức isNetworkConnected gây ra vấn đề, như tôi giải thích trong câu trả lời đã chỉnh sửa của mình. –

+1

Điều này không có ý nghĩa với tôi. Anh ta không gọi 'isNetworkConnected()' được gọi trong phương thức 'onClick()' của trình xử lý nhấp chuột. Cái gì khác phải được gọi là 'isNetworkConnected()' bên cạnh trình xử lý nhấp chuột. –

8

Lỗi là do tạo ra sự sáng tạo đối tượng này.

AlertDialog.Builder builder = new AlertDialog.Builder(this); 

bạn nên làm điều này sau khi onCreate đã được gọi.

+0

Đúng, đó là vấn đề với mã của tôi! Cảm ơn nhiều! – Igal

0

thêm quyền sau vào AndroidManifest.xml tệp.

tôi nghĩ bạn quên thêm quyền này.

android.permission.ACCESS_NETWORK_STATE 

nó sẽ giúp bạn.

0

Vấn đề là bạn xác định "người nghe" dưới dạng biến toàn cục. Vì nó được đưa ra trong thông báo lỗi: Các dịch vụ hệ thống không có sẵn cho các Hoạt động trước khi onCreate().

phương pháp onCreate của bạn nên được như thế này:

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

} 
0

Ngoài ra, nếu có một lớp bên trong, nói class MyAdapter extends ArrayAdapter<myModel> hoặc tương tự, nó giúp KHÔNG để nhanh chóng nó - (MyAdapter = new mAdapter<mModel>()) trước hoạt động của onCreate().

0

Câu trả lời đúng là

AlertDialog.Builder builder = new AlertDialog.Builder(this); 

mà đã được đề cập bởi Jeet và lý trí là bạn đã khởi tạo AlertDialog trước khi bất kỳ phương pháp vòng đời của hoạt động thực hiện với bối cảnh Hoạt động đó là một cách logic không đúng.

Và giải pháp cho vấn đề của bạn là

tin OnClickListener listener = new 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(); 
    } 

} 

};

Khởi tạo hộp thoại cảnh báo khi cần hiển thị. Lý do đằng sau việc đăng câu trả lời cho chuỗi cũ này là câu trả lời được chấp nhận và câu trả lời của Jeet đã không giải quyết được vấn đề ngay cả khi bạn di chuyển người nghe onclick của bạn ra khỏi onCreate() vẫn còn vấn đề sẽ giống nhau.

Hôm nay tôi đi qua cùng một vấn đề với Kotlin mà nếu internet không availbe sau đó hiển thị hộp thoại báo lỗi và sai lầm ngớ ngẩn của tôi là

thay vì đi qua bối cảnh là "này" Tôi đã thông qua nó như MainActivity()

đúng R.string.error.errorDialog (this) //

sai R.string.error.errorDialog (MainActivity())

Các vấn đề liên quan