2012-08-10 71 views
-2

我開發了一款Android應用程序,它將在幾天內投入使用。由於NetworkOnMainThreadException,應用程序無法正常工作ICS版

在ICS上測試應用程序時遇到了另一個問題。 它在Pre-GingerBread和GingerBread版本設備上工作正常。當測試ICS設備時,它將投擲NetworkOnMainThreadException,並通過將AsyncTask中的HTTP Calls刪除。

但我的問題是,我正在製作4到5個不同的HTTP Url calls並且調用每個url都需要一個AsyncTask,因爲這些URL應該一個接一個地同時執行。

如果一個url的結果失敗,那麼下一個url不應該被調用,並且應該在UI上更新。所以我爲每個URL調用採取AsyncTask

我們可以在單個片段中有多個AsyncTasks嗎?至於我在我的片段類中擁有最多3個AsyncTask

如果是這樣,我們可以從第一個AsyncTaskPostExecute方法開始執行另一個AsyncTask方法。

在此先感謝。

+0

'同時一個接一個'肯定只能發生在第五維? – paulkayuk 2012-08-10 08:50:52

回答

2

您可以將所有HTTP調用放在一個ASyncTask中,並使用publishProgress回調報告。當一個失敗時,您可以停止該ASyncTask,其他人將不會被調用。

1

一個NetworkOnMainThreadException一般是很差的代碼標誌,它會導致用戶體驗不佳,因爲應用程序在運行某種網絡活動時會鎖定它。是的,(不幸的是)它適用於預蜂窩設備,但這不是任何人應該去做的。

爲了解決您的問題,我強烈建議您使用一個AsyncTask並在doInBackground()方法中連續執行所有HTTP呼叫。對於每個呼叫,請檢查呼叫是否成功。如果確實如此,那麼它將繼續進行下一步 - 如果失敗,則可以僅在return null之後再進行HTTP調用,而onPostExecute()方法將自動調用。非常簡單。

這裏是什麼,我心裏有一個例子:

private class DoNetworkStuff extends AsyncTask<String, Integer, String> { 

protected String doInBackground(String... params) { 
    // Do network call 
    if (!call.hasSucceeded()) return null; 

    // Do next network call 
    if (!call.hasSucceeded()) return null; // Check if call succeeded - pseudo code 

    // Continue this pattern with all your network calls 

    return ""; // If this point is reached, all network calls succeeded 
} 

protected void onPostExecute(String result) { 
    if (result != null) { 
     // All calls succeeded - celebrate! 
    } else { 
     // A call failed - clean-up... 
    } 
} 

} 

看看對的AsyncTask的文檔,做任何事情之前瞭解它。我敢肯定,這將適用於您的應用程序:http://developer.android.com/reference/android/os/AsyncTask.html

+0

首先,不要發表相同的評論所有三個答案。你可以擁有任意數量的AsyncTasks,但不是必需的。你需要知道的一切都在我的答案中。 – 2012-08-10 10:27:42

相關問題