我在這裏不知所措。我正在嘗試使用從RESTful API中提取的數據在我的活動中填充List。我已經創建了使用Apache HttpClient庫(org.apache.http.client)與API進行會談(成功)的API層。但是,當我嘗試將活動與API層(通過AsyncTask)連接在一起時發生災難時。我從有問題的代碼中刪除了API層,而是嵌入了我能想到的最簡單的例子來嘗試隔離問題(無濟於事)。這裏是有問題的代碼:FatalException在AsyncTask中使用HttpClient與Android
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的版本麻煩)更新。仍然不知道是什麼令我對其他圖書館感到悲傷。
什麼是在線70? – Emmanuel
CloseableHttpClient client = HttpClients.createDefault(); – BeardedCoder