Android IntentService can't instantiate class; no empty constructor

匿名 (未验证) 提交于 2019-12-03 08:33:39

问题:

I have a MainActivity class that needs to access an online API (thus using network resources). This requires a background thread that I've created in a separate file HttpRequestService.java.

MainActivity.java:

public class MainActivity extends Activity {     public static final String API_KEY = "KEYKEYKEYKEYKEY";     public static final String CLIENT_ID = "IDIDIDIDIDIDID";     private final String BROADCAST_ACTION = "com.example.BROADCAST";     private final String EXTENDED_DATA_STATUS = "com.example.STATUS";     static final String LOGCAT_TAG = "TAGTAGTAGTAGTAG";      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);     }      @Override     protected void onResume() {         super.onResume();          String token = "TOKENTOKENTOKENTOKEN";         String urlString = "https://www.example.com/api?key=" + API_KEY;          // Create and start intent for HttpRequestService background thread.         Intent httpRequestServiceIntent = new Intent(this, HttpRequestService.class);         httpRequestServiceIntent.putExtra("token", token);         httpRequestServiceIntent.putExtra("urlString", urlString);         httpRequestServiceIntent.putExtra("client_id", CLIENT_ID);         DownloadStateReceiver downloadStateReceiver = new DownloadStateReceiver();         LocalBroadcastManager.getInstance(this).registerReceiver(downloadStateReceiver, new IntentFilter(BROADCAST_ACTION));         this.startService(httpRequestServiceIntent);     }      private class DownloadStateReceiver extends BroadcastReceiver {         // Broadcast receiver for receiving status updates from IntentService         private DownloadStateReceiver() {             // prevents instantiation         }         @Override         public void onReceive(Context context, Intent intent) {             String message = intent.getStringExtra(EXTENDED_DATA_STATUS);             Log.d(LOGCAT_TAG, "onReceive received message: " + message);             Toast.makeText(context, "Success!: " + message, Toast.LENGTH_LONG).show();         }     } 

HttpRequestService.java:

public final class HttpRequestService extends IntentService {      public HttpRequestService(String name) {         super(name);         Log.e(LOGCAT_TAG, "You called the HttpRequestService directly. Don't do that. Call onHandleIntent.");     }      private final String LOGCAT_TAG = "HttpRequestService";     private final String BROADCAST_ACTION = "com.genda.dayplanner.BROADCAST";     private final String EXTENDED_DATA_STATUS = "com.genda.dayplanner.STATUS";      @Override     protected void onHandleIntent(Intent intent) {         // Gets data from the incoming Intent         String token = intent.getStringExtra("token");         String urlString = intent.getStringExtra("urlString");         String client_id = intent.getStringExtra("client_id");         Boolean extraError = false;         if (token == null) {             Log.e(LOGCAT_TAG, "Intent didn't contain required token.");             extraError = true;         }         if (urlString == null) {             Log.e(LOGCAT_TAG, "Intent didn't contain required urlBundle.");             extraError = true;         }         if (client_id == null) {             Log.e(LOGCAT_TAG, "Intent didn't contain required client_id.");             extraError = true;         }         if (extraError == true) {             // error response         }          // Now do request          URL url = null;         try {             url = new URL(urlString);         } catch (MalformedURLException e) {             Log.e(LOGCAT_TAG, "The URL for requesting the tasks API was malformed.");         }         HttpURLConnection conn = null;         try {             conn = (HttpURLConnection) url.openConnection();         } catch (IOException e) {             Log.e(LOGCAT_TAG, "Bad connection to the API URL");         }         conn.addRequestProperty("client_id", client_id);         conn.setRequestProperty("Authorization", "OAuth " + token);         String result = null;         try {             InputStream in = new BufferedInputStream(conn.getInputStream());             result = convertStreamToString(in);         } catch (IOException e) {             e.printStackTrace();         } finally {             conn.disconnect();         }          // Create new Intent with URI object         Intent localIntent = new Intent(BROADCAST_ACTION);         localIntent.putExtra(EXTENDED_DATA_STATUS, result);         // Broadcasts intent to receivers in this app.         LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent);     }      public static String convertStreamToString(InputStream in) {         // Use BufferedReader.readLine() method. Iterate until BufferedReader returns null (no more data to read). Each line appended to StringBuilder.         BufferedReader reader = new BufferedReader(new InputStreamReader(in));         StringBuilder sb = new StringBuilder();         String line = null;         try {             while ((line = reader.readLine()) != null) {                 sb.append(line + "\n");             }         } catch (IOException e) {             e.printStackTrace();         } finally {             try {                 in.close();             } catch (IOException e) {                 e.printStackTrace();             }         }         return sb.toString();     } } 

Here's the LogCat:

09-21 17:15:28.157: D/dalvikvm(11055): newInstance failed: no <init>() 09-21 17:15:28.157: D/AndroidRuntime(11055): Shutting down VM 09-21 17:15:28.157: W/dalvikvm(11055): threadid=1: thread exiting with uncaught exception (group=0x41f3b700) 09-21 17:15:28.167: E/AndroidRuntime(11055): FATAL EXCEPTION: main 09-21 17:15:28.167: E/AndroidRuntime(11055): java.lang.RuntimeException: Unable to instantiate service com.example.HttpRequestService: java.lang.InstantiationException: can't instantiate class com.example.HttpRequestService; no empty constructor 09-21 17:15:28.167: E/AndroidRuntime(11055):    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2561) 09-21 17:15:28.167: E/AndroidRuntime(11055):    at android.app.ActivityThread.access$1600(ActivityThread.java:141) 09-21 17:15:28.167: E/AndroidRuntime(11055):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1338) 09-21 17:15:28.167: E/AndroidRuntime(11055):    at android.os.Handler.dispatchMessage(Handler.java:99) 09-21 17:15:28.167: E/AndroidRuntime(11055):    at android.os.Looper.loop(Looper.java:137) 09-21 17:15:28.167: E/AndroidRuntime(11055):    at android.app.ActivityThread.main(ActivityThread.java:5103) 09-21 17:15:28.167: E/AndroidRuntime(11055):    at java.lang.reflect.Method.invokeNative(Native Method) 09-21 17:15:28.167: E/AndroidRuntime(11055):    at java.lang.reflect.Method.invoke(Method.java:525) 09-21 17:15:28.167: E/AndroidRuntime(11055):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 09-21 17:15:28.167: E/AndroidRuntime(11055):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 09-21 17:15:28.167: E/AndroidRuntime(11055):    at dalvik.system.NativeStart.main(Native Method) 09-21 17:15:28.167: E/AndroidRuntime(11055): Caused by: java.lang.InstantiationException: can't instantiate class com.example.HttpRequestService; no empty constructor 09-21 17:15:28.167: E/AndroidRuntime(11055):    at java.lang.Class.newInstanceImpl(Native Method) 09-21 17:15:28.167: E/AndroidRuntime(11055):    at java.lang.Class.newInstance(Class.java:1130) 09-21 17:15:28.167: E/AndroidRuntime(11055):    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2558) 09-21 17:15:28.167: E/AndroidRuntime(11055):    ... 10 more 

The important part I think is the can't instantiate class com.example.HttpRequestService; no empty constructor. I've seen several other discussions similar to this, but they've all be able to solve the problem because their class is a subclass of their MainActivity. So they just make the subclass static and it solves the problem. Unfortunately, as a separate class HttpRequestService cannot be static. Any suggestions?

回答1:

The Exception is telling you that you need to implement the default public constructor.

  public HttpRequestService() {     super("Name for Service");        } 

The default public constructor is a constructor with no parameters.

Here you call super() and pass a String that will be used to name the IntentService



回答2:

One other thing to keep in mind: If you have your service as a nested class it has to be static.

Compare intentservice no empty constructor, but there is a constructor



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!