2

私はここで途方に暮れています。RESTful API から取得したデータを使用して、アクティビティにリストを入力しようとしています。Apache HttpClient ライブラリ (org.apache.http.client) を使用して、API と (正常に) 対話する API レイヤーを作成しました。ただし、Activity を (AsyncTask を介して) API レイヤーに接続しようとすると、大惨事が発生しました。問題のコードから API レイヤーを削除し、代わりに考えられる最も単純な例を埋め込んで、問題を切り分けようとしました (役に立たなかった)。問題のコードは次のとおりです。

public class MyActivity extends Activity {

@Override
protected void onCreate( Bundle savedInstanceState ) {

    super.onCreate( savedInstanceState );
    setContentView( R.layout.main );
}

@Override
protected void onResume() {

    super.onResume();
    new GetEventsTask().execute();
}

private class GetEventsTask extends AsyncTask<Object, Integer, List<IEvent>> {

    @Override
    protected List<IEvent> doInBackground( Object... params ) {

        fetch();
        return null;
    }

    @Override
    protected void onPostExecute( List<IEvent> events ) {

        Toast.makeText( getApplicationContext(), "Success", Toast.LENGTH_SHORT ).show();
    }

    private void fetch() {
        CloseableHttpClient client = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost( "https://someurl.com/login" );

        List<NameValuePair> data = new ArrayList<NameValuePair>();
        data.add( new BasicNameValuePair( "username", "hai" ) );
        data.add( new BasicNameValuePair( "password", "kthxbye" ) );

        try {
            httpPost.setEntity( new UrlEncodedFormEntity( data ) );
            CloseableHttpResponse response = client.execute( httpPost );
        } catch( Exception e ) {
            Toast.makeText( getApplicationContext(), "Caught Exception", Toast.LENGTH_SHORT ).show();
        }
    }
}

そして、ここにスタックトレースがあります:

10-16 19:36:04.264: ERROR/AndroidRuntime(633): FATAL EXCEPTION: AsyncTask #1
    java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:200)
    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
    at java.lang.Thread.run(Thread.java:1019)
    Caused by: java.lang.ExceptionInInitializerError
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:487)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:147)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:136)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:112)
    at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:727)
    at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58)
    at ca.redacted.app.MyActivity$GetEventsTask.fetch(MyActivity.java:70)
    at ca.redacted.app.MyActivity$GetEventsTask.doInBackground(MyActivity.java:49)
    at ca.redacted.app.MyActivity$GetEventsTask.doInBackground(MyActivity.java:44)
    at android.os.AsyncTask$2.call(AsyncTask.java:185)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
    ... 4 more
    Caused by: java.lang.ExceptionInInitializerError
    at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:72)
    at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:84)
    at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:59)
    ... 15 more
    Caused by: java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE
    at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
    at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56)
    at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46)
    ... 18 more

私は Android プログラミングに比較的慣れていない (そしてしばらくの間 Java に触れていない) ので、どんな助けも大歓迎です。

更新さ れたデバッグの実行に基づいて、これは FatalException をスローしている行です

CloseableHttpClient クライアント = HttpClients.createDefault();

再更新

Android 提供の DefaultHttpClient 実装を使用するように切り替えると、問題が解決しました (他の誰かが Apache バージョンを使用して問題に遭遇した場合)。他のライブラリで何が私を悲しませていたのか、まだわかりません。

4

2 に答える 2

2

HttpClients は Android コードに組み込まれていないため、apache ライブラリを追加したと仮定します。ここを参照してください。ランタイム例外を取得しているのにコンパイル例外を取得していない理由は、ライブラリがアプリケーションと共にエクスポートされていないためだと思います。

ExceptionInInitializerError

ここ (HttpClients) を指している静的クラスのロードに失敗したことを意味します。

CloseableHttpClient client = HttpClients.createDefault();

これを修正するには、eclipse でアプリケーションを使用して外部 apache ライブラリをエクスポートする必要があります。

Project-> config build path-> エクスポートする lib を選択します。

それに加えて、@codeMagic は、UI スレッドで実行する必要があるため、catch 句で Toast を使用できないことを指摘しました。現在のコードは try 句に達していないため、例外は発生しませんが、注意が必要です。

于 2013-10-16T20:12:14.647 に答える
1

私が見たところ、これはあなたの現在の問題ではないようですが、ある時点で問題になるでしょう. これらの行

catch( Exception e ) {
        Toast.makeText( getApplicationContext(), "Caught Exception", Toast.LENGTH_SHORT ).show();

を更新してUIおり、それから呼び出されているため、例外が発生するdoInBackground()バックグラウンドで実行されています。これを処理する方法は、取得した応答のタイプに応じて、そこからThreadを渡し、そこresponseからonPostExecute()更新することです。UI

Javaのドキュメントによると

この例外は、の初期化の問題から発生しますstatic Class。この行からさかのぼって

CloseableHttpClient client = HttpClients.createDefault();

なぜそれが失敗するのかを見てください。

于 2013-10-16T19:59:38.783 に答える