Android的IntentService无法实例类;没有空的构造 [英] Android IntentService can't instantiate class; no empty constructor

查看:1029
本文介绍了Android的IntentService无法实例类;没有空的构造的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 MainActivity 类需要(从而使用网络资源)来访问一个在线的API。这就要求我在一个单独的文件中已经创建了一个后台线程的Htt prequestService.java

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.

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

的Htt prequestService.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

我觉得最重要的部分是无法实例类com.example.Htt prequestService;没有空的构造。我见过类似这样的其他一些讨论,但他们都能够解决这个问题,因为他们班是他们MainActivity的子类。因此,他们只是让子类静态的,它解决了这个问题。不幸的是,作为一个单独的类的Htt prequestService 不能是静态的。有什么建议?

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?

推荐答案

异常告诉你,你需要实现默认的公共构造。

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

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

默认的公共构造函数是不带参数的构造函数。

在这里,你叫超(),并通过字符串将被用于命名 IntentService

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

这篇关于Android的IntentService无法实例类;没有空的构造的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆