2012-08-08 21 views
87

Tôi đang phải vật lộn với lỗi này:Không constructor rỗng khi tạo ra một dịch vụ

08-08 11:42:53.179: E/AndroidRuntime(20288): Caused by: java.lang.InstantiationException: can't instantiate class com.example.localnotificationtest.ReminderService; no empty constructor

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

Tôi đang cố gắng xuất hiện thông báo vào thời gian cụ thể và sau khi tìm kiếm thời gian tôi tìm thấy số này old stackoverflow question. Tôi đã thử tất cả mọi thứ nhưng mã của tôi cho lỗi.

Hãy giúp tôi giải quyết vấn đề này.

Đây là mã MainActivity 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 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à manifest.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 tôi đang đi đâu sai. Tôi có thiếu mã nào không?

Trả lời

210

Bạn cần phải thêm một constructor rỗng đến lớp học của bạn có nghĩa là mật mà không có đối số:

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

Giải thích từ documentation:

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ụ ý định.

+9

Bold that ** Constructor không có đối số ** –

31

Khai báo một mặc định không tham số constructor cho IntentService

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

Nếu bạn đã dịch vụ của bạn khai báo là một Nội Lớp/Nested class, bạn cũng cần phải thực hiện lớp tĩnh

Nếu không, bạn sẽ gặp lỗi ngay cả khi nhà xây dựng của bạn chính xác

+0

Tài liệu này được viết ở đâu? –

+0

Tôi không biết nếu nó được tài liệu ở bất cứ đâu, nhưng nếu bạn muốn khởi tạo các lớp không tĩnh bên trong, lớp bên ngoài phải được khởi tạo trước. Bây giờ nếu bạn bắt đầu một dịch vụ, cá thể được tạo ra bởi hệ thống, mà sẽ không biết rằng nó phải tạo ra một cá thể từ lớp ngoài trước tiên, vì vậy nó sẽ sụp đổ. Nhưng lỗi thực sự gây nhầm lẫn trong trường hợp đó. hãy xem http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class –

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