gpt4 book ai didi

java - FatalException 在 Android 的 AsyncTask 中使用 HttpClient

转载 作者:搜寻专家 更新时间:2023-11-01 08:55:18 25 4
gpt4 key购买 nike

我在这里不知所措。我正在尝试使用从 RESTful API 中提取的数据在我的 Activity 中填充一个列表。我创建了 API 层,它使用 Apache HttpClient 库 (org.apache.http.client) 与 API 对话(成功)。然而,当我试图将 Activity 与 API 层连接(通过 AsyncTask)时,灾难接踵而至。我从有问题的代码中删除了 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 client = HttpClients.createDefault();

再次更新

切换到使用 Android 提供的 DefaultHttpClient 实现解决了这个问题(以防其他人在使用 Apache 版本时遇到麻烦)。仍然不知道是什么让我对另一个图书馆感到悲伤。

最佳答案

我假设您已经添加了 apache 库,因为 HttpClients 没有内置在 Android 代码中,请参阅 here .你得到运行时异常而不是编译异常的原因我认为是因为你的库没有随你的应用程序一起导出。

ExceptionInInitializerError

表示它无法加载指向此处 (HttpClients) 的静态类:

CloseableHttpClient client = HttpClients.createDefault();

为了解决这个问题,您必须在 eclipse 中使用应用程序导出外部 apache 库:

Project-> config build path-> select lib to export.

除此之外,@codeMagic 指出您的 catch 子句不能使用 Toast,因为它应该在 UI 线程上运行。这不会导致您的异常,因为您当前的代码没有到达 try 子句,而是一个提示。

关于java - FatalException 在 Android 的 AsyncTask 中使用 HttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19412558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com