2011-09-13 91 views
0

這段代碼在UI線程中使用時有用,但想將其移入AsyncTask類。我剛剛讀完如何做到這一點,但是當我運行該應用程序時,它正在開始閱讀課程時崩潰。AsyncTask類解析XML

該類在將其加載到List之前調用並解析XML文件。這是我的第一個Android應用程序,所以你可以提供任何幫助。

感謝

public class DownloadXml extends AsyncTask<String, Void, String> 
{  
    private ProgressDialog pd; 
    protected String doInBackground(String... platform) 
    { 
     pd = ProgressDialog.show(CategoryData.this, "Please Wait...", "Loading games"); 

     try 
     { 
      BaseFeedParser parser = new BaseFeedParser(); 
      messages = parser.parse(); 
     } 
     catch (Throwable t) 
     { 
      Log.e("RetailApp",t.getMessage(),t); 
     } 
     return rowPlatform; 
    } 


    protected void onPostExecute(String rowPlatform) 
    { 
     productList = new ArrayList<HashMap<String, Object>>(); 

      for (Message msg : messages) 
      { 
       if(msg.getPlatform().compareTo(rowPlatform) == 0) 
       { 
        HashMap<String, Object> map = new HashMap<String, Object>(); 
        map.put("Title", msg.getTitle()); 
        map.put("Brand", msg.getBrand()); 
        map.put("Price", "$" + msg.getPrice()); 

        try 
        { 
         String picture[] = msg.getImage().split("-large.jpg"); 
         URL pictureURL = new URL(picture[0] + "-medium.jpg"); 
         Bitmap bitmap = BitmapFactory.decodeStream(pictureURL.openStream()); 
         map.put("Img",bitmap); 
        } 
       catch (Throwable t) 
       { 
        Log.e("RetailApp",t.getMessage(),t); 
       } 
       productList.add(map); 
       } 
      } 

編輯:我提出了「for」循環到onPostExecute這似乎提高了代碼,但我仍然收到「未註冊的句柄仍鎖定」的錯誤。有任何想法嗎?

感謝您的想法羅布,但沒有運氣,已經從背景中刪除循環和吐司...上面的新代碼。我收到錯誤「未捕獲的處理程序:線程AsycTask#1由於未捕獲的異常退出」

+0

您在doInBackground中使用Toast,嘗試刪除 – Rob

+0

感謝Rob的想法,但沒有運氣,已從後臺刪除循環和Toast ...上面的新代碼。我收到錯誤「未捕獲的處理程序:線程AsycTask#1由於未捕獲的異常而退出」 – pommi

+0

請提供完整的堆棧跟蹤。這個很重要。請同時處理髮生異常的行。最後:'rowPlatform'從哪裏來? – WarrenFaith

回答

1

使用您的LogCat。 AndroidRuntime日誌會給你一個完整的堆棧跟蹤和一個強類型的異常,它會告訴你它爲什麼崩潰。

我很確定這是事實,你試圖從後臺線程顯示ProgressDialog。您應該在執行AsyncTask之前在UI線程上執行此操作。您可以在onPostExecute駁回,因爲這跑回到UI線程

+0

謝謝里奇 - 畢竟看着它的時間,這是一件很愚蠢的事! – pommi

+0

通常情況下,它通常只需要大聲說出來或在它上面放一雙新的眼睛。樂意效勞。 – Rich

0

pd = ProgressDialog.show(CategoryData.this, "Please Wait...", "Loading games"); 

那張在onPreExecute(),這就是所謂的UI線程之前執行開始。