Java 在Android的AsyncTask中使用HttpClient的FatalException
我在这里不知所措。我试图使用从RESTful API中提取的数据填充活动中的列表。我已经创建了API层,它使用ApacheHttpClient库(org.Apache.http.client)与API对话(成功)。然而,当我尝试将活动与API层连接(通过AsyncTask)时,灾难接踵而至。我从讨论中的代码中删除了API层,而是嵌入了我能想到的最简单的示例,以尝试隔离问题(但没有效果)。下面是有问题的代码:Java 在Android的AsyncTask中使用HttpClient的FatalException,java,android,android-asynctask,Java,Android,Android Asynctask,我在这里不知所措。我试图使用从RESTful API中提取的数据填充活动中的列表。我已经创建了API层,它使用ApacheHttpClient库(org.Apache.http.client)与API对话(成功)。然而,当我尝试将活动与API层连接(通过AsyncTask)时,灾难接踵而至。我从讨论中的代码中删除了API层,而是嵌入了我能想到的最简单的示例,以尝试隔离问题(但没有效果)。下面是有问题的代码: public class MyActivity extends Activity {
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();
}
}
}
公共类MyActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@凌驾
受保护的void onResume(){
super.onResume();
新建GetEventsTask().execute();
}
私有类GetEventsTask扩展异步任务{
@凌驾
受保护列表doInBackground(对象…参数){
fetch();
返回null;
}
@凌驾
受保护的void onPostExecute(列出事件){
Toast.makeText(getApplicationContext(),“Success”,Toast.LENGTH_SHORT.show();
}
私有void fetch(){
CloseableHttpClient=HttpClients.createDefault();
HttpPost HttpPost=新的HttpPost(“https://someurl.com/login" );
列表数据=新的ArrayList();
添加(新的BasicNameValuePair(“用户名”,“hai”));
添加(新的BasicNameValuePair(“密码”、“kthxbye”);
试一试{
setEntity(新的UrlEncodedFormEntity(数据));
CloseableHttpResponse response=client.execute(httpPost);
}捕获(例外e){
Toast.makeText(getApplicationContext(),“捕获异常”,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
10-16 19:36:04.264:错误/AndroidRuntime(633):致命异常:AsyncTask#1
java.lang.RuntimeException:执行doInBackground()时出错
在android.os.AsyncTask$3.done(AsyncTask.java:200)
位于java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
位于java.util.concurrent.FutureTask.setException(FutureTask.java:125)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
位于java.util.concurrent.FutureTask.run(FutureTask.java:138)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
运行(Thread.java:1019)
原因:java.lang.ExceptionInInitializeError
位于org.apache.http.impl.conn.PoolightTPClientConnectionManager$InternalConnectionFactory。(PoolightTPClientConnectionManager.java:487)
位于org.apache.http.impl.conn.PoolighttpClientConnectionManager。(PoolighttpClientConnectionManager.java:147)
位于org.apache.http.impl.conn.PoolighttpClientConnectionManager。(PoolighttpClientConnectionManager.java:136)
位于org.apache.http.impl.conn.PoolighttpClientConnectionManager。(PoolighttpClientConnectionManager.java:112)
位于org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:727)
位于org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58)
在ca.redact.app.MyActivity$GetEventsTask.fetch(MyActivity.java:70)中
在ca.redacted.app.MyActivity$GetEventsTask.doInBackground(MyActivity.java:49)
在ca.redacted.app.MyActivity$GetEventsTask.doInBackground(MyActivity.java:44)
位于android.os.AsyncTask$2.call(AsyncTask.java:185)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
…还有4个
原因:java.lang.ExceptionInInitializeError
位于org.apache.http.impl.conn.ManagedHttpClientConnectionFactory。(ManagedHttpClientConnectionFactory.java:72)
位于org.apache.http.impl.conn.ManagedHttpClientConnectionFactory。(ManagedHttpClientConnectionFactory.java:84)
位于org.apache.http.impl.conn.ManagedHttpClientConnectionFactory。(ManagedHttpClientConnectionFactory.java:59)
…还有15个
原因:java.lang.NoSuchFieldError:org.apache.http.message.basiclineformter.INSTANCE
位于org.apache.http.impl.io.DefaultHttpRequestWriterFactory。(DefaultHttpRequestWriterFactory.java:52)
位于org.apache.http.impl.io.DefaultHttpRequestWriterFactory。(DefaultHttpRequestWriterFactory.java:56)
位于org.apache.http.impl.io.DefaultHttpRequestWriterFactory。(DefaultHttpRequestWriterFactory.java:46)
…还有18个
我对Android编程比较陌生(有一段时间没有接触过Java),所以非常感谢您的帮助
已更新
基于调试运行,这是抛出FatalException的行
CloseableHttpClient=HttpClients.createDefault() 再次更新
切换到使用Android提供的DefaultHttpClient实现解决了问题(以防其他人在使用Apache版本时遇到问题)。仍然不知道是什么让我对另一个库感到不快。据我所见,这似乎不是您当前的问题,但在某个时候会成为一个问题
catch( Exception e ) {
Toast.makeText( getApplicationContext(), "Caught Exception", Toast.LENGTH_SHORT ).show();
正在更新UI
,由于它是从doInBackground()
调用的,因此它正在后台线程上运行,这将导致异常。处理此问题的方法是将响应
传递到onPostExecute()
并根据收到的响应类型从那里更新UI
此异常源于初始化静态类时出现的问题。请从此行回溯
CloseableHttpClient client = HttpClients.createDefault();
查看失败的原因。我假设您添加了apache库,因为Android代码中没有内置HttpClients,请参阅。您获得运行时异常而不是编译异常的原因我假设是因为您的库没有随应用程序一起导出
ExceptionInInitializerError
CloseableHttpClient client = HttpClients.createDefault();