1

強制終了により、ユーザーから次のスタック トレースが送信されました。

java.lang.IllegalStateException: Scheme 'https' not registered.
at org.apache.http.conn.scheme.SchemeRegistry.getScheme(SchemeRegistry.java:80)
at org.apache.http.impl.conn.DefaultHttpRoutePlanner.determineRoute(DefaultHttpRoutePlanner.java:107)
at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:581)
at org.apache.http.impl.client.DefaultRequestDirector.handleResponse(DefaultRequestDirector.java:923)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:473)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at com.augustinianum.augustinianum.AlarmService.doWakefulWork(AlarmService.java:70)
at com.commonsware.cwac.wakeful.WakefulIntentService.onHandleIntent(WakefulIntentService.java:106)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.os.HandlerThread.run(HandlerThread.java:60)

強制終了するクラスの最も重要なコードは次のとおりです。これは Commonsware による WakefulIntentService です。これは基本的には通常の IntentService ですが、これは自動的にウェイクロックを保持します (これは例外と関係があるとは思わないでください。念のため)。このコードは、Web ページの HTML コードをダウンロードします。

private DefaultHttpClient createHttpClient() {
        HttpParams my_httpParams = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(my_httpParams, 3000);
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        ThreadSafeClientConnManager multiThreadedConnectionManager = new ThreadSafeClientConnManager(my_httpParams, registry);
        DefaultHttpClient httpclient = new DefaultHttpClient(multiThreadedConnectionManager, my_httpParams);
        return httpclient;
    }


@Override
    protected void doWakefulWork(Intent arg0) {

        int mStatusCode = 0;
        String content = "";

        String url = "http://www.example.com/";

        DefaultHttpClient httpclient = createHttpClient();
        HttpGet httpget = new HttpGet(url);

        try {
            HttpResponse response = httpclient.execute(httpget);
            StatusLine statusLine = response.getStatusLine();
            mStatusCode = statusLine.getStatusCode();

            if (mStatusCode == 200){
                content = EntityUtils.toString(response.getEntity());
            }

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

70 行目 (クラッシュする場所) は次の行です。

HttpResponse response = httpclient.execute(httpget);

私のマニフェストでは、次のように宣言しました。

<service
    android:name=".AlarmService">
</service>

奇妙なことに、この例外はすべてのデバイスで発生するわけではなく、このコードが実行されたときに常に発生するとは限りません。ほとんどの場合、このコードは問題なく実行されますが、この例外が発生することがあります。

これについて私に何ができるか知っている人はいますか?

よろしくお願いします!

4

2 に答える 2

2

は 1 つのスレッドしか使用しないためThreadSafeClientConnManager、は必要ありません。IntentService私はそのすべてのものを削除します。これにより、あなたの custom が削除SchemeRegistryされ、未登録のスキームに役立つ可能性があります。

于 2013-03-02T16:12:26.843 に答える