Không có hàm tạo nào trống khi tạo một dịch vụ


98

Tôi đang đấu tranh với lỗi này:

08-08 11: 42: 53.179: E / AndroidRuntime (20288): Gây ra bởi: java.lang.InstantiationException: không thể khởi tạo lớp com.example.localnotificationtest.ReminderService; không có hàm tạo trống

Tôi không hiểu tại sao lại xảy ra lỗi này.

Tôi đang cố gắng xuất hiện thông báo vào một thời điểm cụ thể và sau khi tìm kiếm một thời gian, tôi đã tìm thấy câu hỏi cũ về stackoverflow này . Tôi đã thử mọi thứ nhưng mã của tôi báo lỗi.

Làm ơn hãy giúp tôi giải quyết vấn đề này.

Đây là mã MainActivity của tôi:

public class MainActivity extends Activity {
    int mHour, mMinute;
    ReminderService reminderService;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        reminderService = new ReminderService("ReminderService");

        TimePickerDialog dialog = new TimePickerDialog(this, mTimeSetListener, mHour, mMinute, false);
        dialog.show();
    }

    TimePickerDialog.OnTimeSetListener mTimeSetListener =  new OnTimeSetListener() {

        @Override
        public void onTimeSet(TimePicker v, int hourOfDay, int minute) {
            mHour = hourOfDay;
            mMinute = minute;

            AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
            Calendar c = Calendar.getInstance();
            c.set(Calendar.YEAR, Calendar.YEAR);
            c.set(Calendar.MONTH, Calendar.MONTH);
            c.set(Calendar.DAY_OF_MONTH, Calendar.DAY_OF_MONTH);
            c.set(Calendar.HOUR_OF_DAY, mHour);
            c.set(Calendar.MINUTE, mMinute);
            c.set(Calendar.SECOND, 0);

            long timeInMills = c.getTimeInMillis();

            Intent intent = new Intent(MainActivity.this, ReminderService.class);
            PendingIntent pendingIntent = PendingIntent.getService(MainActivity.this, 0, intent, 0);
            alarmManager.set(AlarmManager.RTC, timeInMills, pendingIntent);
        }
    };

}

và đây là mã ReminderService của tôi:

public class ReminderService extends IntentService {

    public ReminderService(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 1, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        NotificationManager nm = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

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

        builder.setContentIntent(contentIntent)
            .setSmallIcon(R.drawable.ic_launcher)
            .setTicker("Local Notification Ticker")
            .setWhen(System.currentTimeMillis())
            .setAutoCancel(true)
            .setContentTitle("Local Notification")
            .setContentText("This is content text.");
         Notification n = builder.getNotification();

         nm.notify(1, n);
    }

}

và đây là tệp kê khai.xml của tôi:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.localnotificationtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"  android:label="@string/app_name"  android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity"  android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="ReminderService"></service>
    </application>

</manifest>

Tôi không biết mình đã sai ở đâu. Tôi có thiếu một số mã không?

Câu trả lời:


221

Bạn cần thêm một phương thức khởi tạo trống vào lớp của mình, tức là một phương thức khởi tạo không có đối số:

public ReminderService() {
    super("ReminderService");
}

Giải thích từ tài liệu :

Các nameđược sử dụng để đặt tên cho các sợi nhân.

LƯU Ý : điều này chỉ áp dụng cho dịch vụ dự định.


9
Bold rằng Constructor không có lập luận
Pratik Butani

44

Nếu bạn đã khai báo Dịch vụ của mình là Lớp bên trong / Lớp lồng nhau , thì bạn cũng cần đặt lớp tĩnh

Nếu không có điều đó, bạn sẽ gặp lỗi ngay cả khi hàm tạo của bạn đúng

Giải trình

Lý do là, bạn chỉ có thể khởi tạo các lớp bên trong trong ngữ cảnh của lớp bên ngoài, vì vậy trước tiên bạn cần tạo một thể hiện của lớp bên ngoài.

Khai báo lớp bên trong của bạn tĩnh làm cho nó độc lập với lớp bên ngoài của nó



Tôi không biết liệu nó có được ghi lại ở bất cứ đâu hay không, nhưng nếu bạn muốn khởi tạo các lớp bên trong không tĩnh, thì lớp bên ngoài phải được khởi tạo trước. Bây giờ nếu bạn khởi động một dịch vụ, thì cá thể đó được tạo bởi hệ thống, hệ thống sẽ không biết rằng nó phải tạo một cá thể từ lớp bên ngoài trước, vì vậy nó sẽ bị lỗi. Nhưng lỗi thực sự gây hiểu lầm trong trường hợp đó. hãy xem stackoverflow.com/questions/70324/…
Marian Klühspies

32

Khai báo một hàm tạo không đối số mặc định cho IntentService

public class ReminderService extends IntentService {
    public ReminderService() {
      super("ReminderService");
    }
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.