나는 여기를 잃고있다. RESTful API에서 가져온 데이터를 사용하여 내 Activity에서 List를 채우려고합니다. Apache HttpClient 라이브러리 (org.apache.http.client)를 사용하여 API와 (성공적으로) 대화하는 API 레이어를 만들었습니다. 그러나 AsyncTask를 통해 Activity를 API 레이어에 연결하려고 시도했을 때 재앙이 발생했습니다. 문제의 코드에서 API 레이어를 제거하고 대신 문제를 (문제가없는) 분리하려고 생각할 수있는 가장 간단한 예제를 삽입했습니다. 나는 안드로이드 프로그래밍 비교적 새로운 해요 (그리고 한 동안 자바 손도 안) 그래서 어떤 도움안드로이드와 AsyncTask에서 HttpClient를 사용하는 FatalException
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
: 여기
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();
}
}
}
그리고 스택 추적한다 : 여기에 문제의 코드는 대단히 감사합니다.
업데이트 디버그 실행을 기반으로 ,이
CloseableHttpClient 클라이언트 = HttpClients.createDefault()을 FatalException을 던지고 라인입니다;
은 다시 안드로이드 DefaultHttpClient 구현 (경우 다른 사람이 아파치 버전을 사용하는 문제로 실행에) 문제를 해결 공급 사용 전환
업데이트되었습니다. 아직도 다른 도서관에서 저를 슬프게하는 원인이 무엇인지 모르겠습니다.
온라인 70은 무엇입니까? – Emmanuel
CloseableHttpClient 클라이언트 = HttpClients.createDefault(); – BeardedCoder