2014-04-11 31 views
0

在我的RSS閱讀器應用程序中,我試圖檢查輸入RSS網址是否有效。如果是這樣,我會將它保存在SQLite數據庫中。我的方法是使用的AsyncTask:錯誤,同時在AsyncTask中顯示Toast Android

class mAsyncTask extends AsyncTask<String, Integer, String> 
{ 
    private boolean succeed = false; 

    public mAsyncTask() 
    { 
    } 

    protected String doInBackground(String... urls) 
    { 
     try 
     { 
      URL sourceUrl = new URL(sourceUrlString); 

      XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(false); 
      XmlPullParser xpp = factory.newPullParser(); 

      // We will get the XML from an input stream 
      xpp.setInput(global.getInputStream(sourceUrl), "UTF_8"); 

      // if it reach here, it means the XML is in a valid 
      // format 
      if (xpp.getEventType() == XmlPullParser.START_TAG) 
      { 
       if (xpp.getName().equalsIgnoreCase("title")) 
        sourceTitle = xpp.nextText(); 
       succeed = true; 
      } 
     } 
     catch (MalformedURLException e) 
     { 
      e.printStackTrace(); 
      Toast.makeText(getApplicationContext(), "Input RSS feed is not in the valid format...", Toast.LENGTH_LONG).show(); 
     } 
     catch (XmlPullParserException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (Exception e) 
     { 
      Toast.makeText(getApplicationContext(), "Unknown error occurred..", Toast.LENGTH_LONG).show(); 
     } 

     return "Complete doInBackground"; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) 
    { 
     super.onProgressUpdate(progress); 
    } 

    @Override 
    protected void onPostExecute(String result) 
    { 
     super.onPostExecute(result); 

     if (succeed == true) 
     { 
      db.addSource(new Sources("", sourceTitle, sourceUrlString)); 

          //refresh 
      Intent intent = getIntent(); 
      finish(); 
      startActivity(intent); 
     } 
    } 
} 

sourceUrlString是AlertDialog輸入字符串。 db是數據庫處理程序類。構造函數構造函數擁有3個變量:類別,標題和Feed的url,所有這些都是String。

基於LogCat,我每次嘗試在catchs內顯示Toast時都會收到錯誤。任何想法爲什麼?另外,這是我第一次嘗試實現AsyncTask,所以你應該注意到任何低效的代碼,請讓我知道。

+2

無法顯示'doInbackground'敬酒,因爲你不能從後臺線程更新UI和doInbackground調用在後臺線程 – Raghunandan

+0

你不能鞋土司doInBackground –

+0

使用的System.out.println(),因爲ü不能更新ui在asynctask – raj

回答

0

由於doInBackGround在單獨的線程上運行,因此無法顯示烤麪包意味着更新UI。但您可以從onPreExecute,onPostExecute和onProgressUpdate更新UI,因爲它們在主線程上運行。因此,您可以使用這些方法來更新UI。

所以你可以publishProgress調用onProgressUpdate顯示吐司或簡單地返回一些價值onPostexecute和展示烤麪包的基礎上..

0

您應該在UI線程上調用Toast。

1

doInBackground()方法在其單獨的線程中運行。它不允許與UIThread交互。你想顯示一個Toast消息,它實際上是UIThread處理的函數。

只要您的控件位於工作線程中,就無法更新您的UI。對於AsyncTask類onPreExecute() & onProgressUpdate()只有這兩種方法允許在UI上執行UIThread時與UI進行交互。

2

試試這個..

不能在doInbackground顯示Toast。所以試試下面。

doInBackground返回字符串如下。

protected String doInBackground(String... urls) 
{ 
    try 
    { 
     URL sourceUrl = new URL(sourceUrlString); 

     XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
     factory.setNamespaceAware(false); 
     XmlPullParser xpp = factory.newPullParser(); 

     // We will get the XML from an input stream 
     xpp.setInput(global.getInputStream(sourceUrl), "UTF_8"); 

     // if it reach here, it means the XML is in a valid 
     // format 
     if (xpp.getEventType() == XmlPullParser.START_TAG) 
     { 
      if (xpp.getName().equalsIgnoreCase("title")) 
       sourceTitle = xpp.nextText(); 
      succeed = true; 
     } 
    } 
    catch (MalformedURLException e) 
    { 
     return "MalformedURLException"; 
     e.printStackTrace();  } 
    catch (XmlPullParserException e) 
    { 
     return "XmlPullParserException"; 
     e.printStackTrace(); 
    } 
    catch (IOException e) 
    { 
     return "IOException"; 
     e.printStackTrace(); 
    } 
    catch (Exception e) 
    { 
     return "Exception";    
    } 

    return "Complete doInBackground"; 
} 

onPostExecute檢查像下面並顯示Toast

@Override 
protected void onPostExecute(String result) 
{ 
    super.onPostExecute(result); 

    if(result.equals("Exception")) 
    { 
     Toast.makeText(getApplicationContext(), "Unknown error occurred..", Toast.LENGTH_LONG).show(); 
    }else if(result.equals("IOException")) 
    { 
     Toast.makeText(getApplicationContext(), "IOException..", Toast.LENGTH_LONG).show(); 
    }else if(result.equals("XmlPullParserException")) 
    { 
     Toast.makeText(getApplicationContext(), "XmlPullParserException..", Toast.LENGTH_LONG).show(); 
    }else if(result.equals("MalformedURLException")) 
    { 
     Toast.makeText(getApplicationContext(), "MalformedURLException..", Toast.LENGTH_LONG).show(); 
    }else{ 


    if(succeed) 
    { 
     db.addSource(new Sources("", sourceTitle, sourceUrlString)); 

         //refresh 
     Intent intent = getIntent(); 
     finish(); 
     startActivity(intent); 
    } 
    } 
} 
0

敬酒應該在UI線程調用。如果你想在doBackground()中顯示烤麪包,你可以使用runOnUiThread()來實現。

catch (Exception e) 
{ 
     YourActivity.this.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       Toast.makeText(getApplicationContext(), "Unknown error occurred..", Toast.LENGTH_LONG).show(); 
     } 
    } 
}); 
2

UI始終運行在單獨的線程,你不能從其他thread.Use處理程序更改UI從後臺線程更新UI。

   handler = new Handler(); 
       handler.post(new Runnable() { 

       @Override 

       public void run() { 

        Toast.makeText(getApplicationContext(), "Unknown error occurred..",  Toast.LENGTH_LONG).show(); 

       } 
     }); 
+0

哈哈,你甚至發佈了行號。想編輯它,但作爲一個懶惰的忍者,我覺得懶得刪除行號。 –

+0

lolz,m新的in stackoverflow亞爾 – Chetan

+0

我已經授予你你的第一個upvote;) –

0

通過runOnUiThread()執行此操作。 Asynctask在單獨的線程中運行,因此您無法從doInBackground()更新UI。

getActivity().runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
    Toast.makeText(getApplicationContext(), "Unknown error occurred..", Toast.LENGTH_LONG).show(); 
    } 
});