Intereting Posts
Событие touchhend не работает на Android Добавление кнопки Google +1 в приложении Android LinearLayout не расширяется внутри ScrollView Метод класса приложения Android onCreate вызывается несколько раз Активность просочилась IntentReceiver, которая была первоначально зарегистрирована здесь. Вам не хватает приглашения на unregisterReceiver ()? Услуги Android: START_STICKY не работает в Kitkat Как удалить предыдущий контент WebView перед загрузкой следующего WebView? Не удалось отладить приложение cordova из-за adb.exe Что делает offsetLeftAndRight () точно? Можно ли проверить, была ли трансляция отправлена ​​в липком режиме? Может ли он быть прерван / удален? Как изменить значок по умолчанию в SearchView, который будет использоваться в панели действий на Android? Отправить тему по названию Курсор Edittext сбрасывается налево после обновления привязки данных Android Выполнение тестов блока Android в командной строке? Диалоговое окно с EditText и Spinner

Android IntentService не может создавать экземпляр класса; Нет пустого конструктора

У меня есть класс MainActivity который должен получить доступ к онлайн-API (таким образом, используя сетевые ресурсы). Для этого требуется фоновый поток, который я создал в отдельном файле 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(); } } 

Вот 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 

Важная часть, я думаю, не can't instantiate class com.example.HttpRequestService; no empty constructor can't instantiate class com.example.HttpRequestService; no empty constructor . Я видел несколько других обсуждений, подобных этому, но они все могут решить проблему, потому что их класс является подклассом их MainActivity. Поэтому они просто делают подкласс статическим, и он решает проблему. К сожалению, как отдельный класс HttpRequestService не может быть статичным. Какие-либо предложения?

Solutions Collecting From Web of "Android IntentService не может создавать экземпляр класса; Нет пустого конструктора"

В « Exception вам сообщается, что вам нужно реализовать стандартный конструктор по умолчанию.

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

Обычный конструктор по умолчанию – это конструктор без параметров .

Здесь вы вызываете super() и передаете String которая будет использоваться для обозначения IntentService

Еще одна вещь, о которой нужно помнить: если у вас есть ваш сервис как вложенный класс, он должен быть статичным.

Сравните intentservice без пустого конструктора, но есть конструктор