2013-10-16 35 views
2

我在這裏不知所措。我正在嘗試使用從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的版本麻煩)更新。仍然不知道是什麼令我對其他圖書館感到悲傷。

+2

什麼是在線70? – Emmanuel

+0

CloseableHttpClient client = HttpClients.createDefault(); – BeardedCoder

回答

2

我認爲你已經添加了apache庫,因爲HttpClients不是內置在Android代碼中,請參閱here。你得到一個運行時異常而不是編譯異常的原因我假設它是因爲你的庫沒有導出與您的應用程序。

ExceptionInInitializerError 

意味着它無法加載,這是指向這裏(HttpClients)一個靜態類:

CloseableHttpClient client = HttpClients.createDefault(); 

爲了解決這個問題,必須在外部Apache庫的應用程序中導出,在eclipse:

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

除此之外,@ codeMagic指出你的catch子句不能使用Toast,因爲它應該在UI線程上運行。這不會導致你的異常,因爲你的當前代碼沒有達到try子句,但是有一個提示。

+0

我使用的是IntelliJ,但是我去了Project Structure> Modules> Dependencies,並勾選Export for所需的庫。但是,沒有變化。 – BeardedCoder

+1

我建議你使用另一個客戶端,例如:DefaultHttpClient,除非你必須使用你正在使用的那個類。可能有一個原因,谷歌決定不在android包中包含'HttpClients'。 [見](http://android-developers.blogspot.com/2011/09/androids-http-clients.html) – wtsang02

+0

因此,切換到DefaultHttpClient解決了這個問題。謝謝!仍然不知道爲什麼另一個沒有工作。 – BeardedCoder

1

從我所看到的情況來看,這似乎不是您當前的問題,但會在某個時候出現問題。這些線

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

正在更新UI並且因爲它是從doInBackground()稱它是在一個背景Thread這將導致異常運行。處理此問題的方法是將response傳遞到onPostExecute(),並根據您獲得的響應類型更新UI

According to the Java Documentation

此異常來自初始化static Class問題。從這條線追溯

CloseableHttpClient client = HttpClients.createDefault(); 

看看爲什麼這是失敗的。

+1

此外,在doinBackground的catch()中使用Log.e(TAG,消息,異常)以獲取更多信息。 –

+0

感謝您的支持。我憤怒地(用咒罵)拋出它來試圖弄清楚發生了什麼事。 – BeardedCoder

+0

@Merrdin作爲K5用戶評論過,使用日誌。 – codeMagic