2012-02-29 46 views
2
try { 
    Get_Webpage obj = new Get_Webpage(url); 
    directory_listings = obj.get_webpage_source(); 
} catch (Exception e) { 
    finish(); 
    m_ProgressDialog.dismiss(); 
    Toast.makeText(this, "You have to be connected to the internet for this application to work", Toast.LENGTH_LONG).show(); 
} 


02-28 22:23:21.055: E/AndroidRuntime(2170): FATAL EXCEPTION: AsyncTask #1 
02-28 22:23:21.055: E/AndroidRuntime(2170): java.lang.RuntimeException: An error occured while executing doInBackground() 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at java.lang.Thread.run(Thread.java:1019) 
02-28 22:23:21.055: E/AndroidRuntime(2170): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at android.os.Handler.<init>(Handler.java:121) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at android.widget.Toast.<init>(Toast.java:68) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at android.widget.Toast.makeText(Toast.java:231) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at net.website.qt.mediaplayer.Main.showToast(Main.java:414) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at net.website.qt.mediaplayer.Main.access$15(Main.java:413) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at net.website.qt.mediaplayer.Main$taskDoSomething.doInBackground(Main.java:199) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at net.website.qt.mediaplayer.Main$taskDoSomething.doInBackground(Main.java:1) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
02-28 22:23:21.055: E/AndroidRuntime(2170):  ... 4 more 

更新例外doInBackground方法

@Override 
protected void onPostExecute(List<Employee> result) 
{    
    m_Employee.clear();  
    m_Employee.addAll(result); 
    m_ProgressDialog.dismiss(); 
    m_adapter.notifyDataSetChanged(); 
} 

我有一個應用程序

這漫長的處理任務,據我瞭解,在SwingWorker的方法doInBackground不 應該做的任何與UI有關的東西。但是,我在那裏可能會有 引發異常,我想用錯誤消息來處理異常。

我該如何處理?

private class taskDoSomething extends AsyncTask<Void, Void, List<Employee>> 
{ 

    @Override 
    protected List<Employee> doInBackground(Void... params) 
    { 
    String url = "http://ofertaweb.ro/android/sleepandlovemusic/list_files.php"; 

    try { 
     Get_Webpage obj = new Get_Webpage(url); 
     directory_listings = obj.get_webpage_source(); 
    } catch (Exception e) { 
     Toast.makeText(this, "You have to be connected to the internet for this application to work", Toast.LENGTH_LONG).show(); 
     finish(); 
    } 

更新的logcat:

02-28 21:47:01.194: W/dalvikvm(1820): threadid=9: thread exiting with uncaught exception (group=0x40015560) 
02-28 21:47:01.314: E/AndroidRuntime(1820): FATAL EXCEPTION: AsyncTask #1 
02-28 21:47:01.314: E/AndroidRuntime(1820): java.lang.RuntimeException: An error occured while executing doInBackground() 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at java.lang.Thread.run(Thread.java:1019) 
02-28 21:47:01.314: E/AndroidRuntime(1820): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at android.os.Handler.<init>(Handler.java:121) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at android.widget.Toast.<init>(Toast.java:68) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at android.widget.Toast.makeText(Toast.java:231) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at net.website.qt.mediaplayer.Main.showToast(Main.java:411) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at net.website.qt.mediaplayer.Main.access$14(Main.java:410) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at net.website.qt.mediaplayer.Main$taskDoSomething.doInBackground(Main.java:197) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at net.website.qt.mediaplayer.Main$taskDoSomething.doInBackground(Main.java:1) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
02-28 21:47:01.314: E/AndroidRuntime(1820):  ... 4 more 
02-28 21:47:02.954: E/WindowManager(1820): Activity net.website.qt.mediaplayer.Main has leaked window [email protected] that was originally added here 
02-28 21:47:02.954: E/WindowManager(1820): android.view.WindowLeaked: Activity net.website.qt.mediaplayer.Main has leaked window [email protected] that was originally added here 
02-28 21:47:02.954: E/WindowManager(1820): at android.view.ViewRoot.<init>(ViewRoot.java:258) 
02-28 21:47:02.954: E/WindowManager(1820): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
02-28 21:47:02.954: E/WindowManager(1820): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
02-28 21:47:02.954: E/WindowManager(1820): at android.view.Window$LocalWindowManager.addView(Window.java:424) 
02-28 21:47:02.954: E/WindowManager(1820): at android.app.Dialog.show(Dialog.java:241) 
02-28 21:47:02.954: E/WindowManager(1820): at android.app.ProgressDialog.show(ProgressDialog.java:107) 
02-28 21:47:02.954: E/WindowManager(1820): at android.app.ProgressDialog.show(ProgressDialog.java:90) 
02-28 21:47:02.954: E/WindowManager(1820): at net.website.qt.mediaplayer.Main.onCreate(Main.java:136) 
02-28 21:47:02.954: E/WindowManager(1820): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
02-28 21:47:02.954: E/WindowManager(1820): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
02-28 21:47:02.954: E/WindowManager(1820): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
02-28 21:47:02.954: E/WindowManager(1820): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
02-28 21:47:02.954: E/WindowManager(1820): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
02-28 21:47:02.954: E/WindowManager(1820): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-28 21:47:02.954: E/WindowManager(1820): at android.os.Looper.loop(Looper.java:123) 
02-28 21:47:02.954: E/WindowManager(1820): at android.app.ActivityThread.main(ActivityThread.java:3683) 
02-28 21:47:02.954: E/WindowManager(1820): at java.lang.reflect.Method.invokeNative(Native Method) 
02-28 21:47:02.954: E/WindowManager(1820): at java.lang.reflect.Method.invoke(Method.java:507) 
02-28 21:47:02.954: E/WindowManager(1820): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
02-28 21:47:02.954: E/WindowManager(1820): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
02-28 21:47:02.954: E/WindowManager(1820): at dalvik.system.NativeStart.main(Native Method) 

更新的最終

+0

你能從logcat發佈stacktrace嗎? – slayton 2012-02-29 02:44:06

+0

我已更新我的問題,請看看 – 2012-02-29 02:50:44

回答

2

這裏最重要的消息是這樣的: Activity net.website.qt.mediaplayer.Main has leaked window [email protected] that was originally added here

這是一個非常常見的錯誤,並已SO已經在處理了幾次:

Activity has leaked window that was originally added

Activity has leaked window [email protected] that was originally added here

我可以肯定的是,違規行是:

 Toast.makeText(this, "You have to be connected to the internet for this application to work", Toast.LENGTH_LONG).show(); 

Toast.makeTextContext作爲其第一個參數,而不是AsyncTask。在這種情況下,當您使用this其指向AsyncTask而不是導致此問題的Context

+0

好吧,所以即使我評論Toast.makeText行後,我仍然得到錯誤,我知道爲什麼我得到這些錯誤,並由於我的代碼試圖訪問互聯網,它失敗了...所以這就是爲什麼我包裝我的代碼'try和catch塊'和'OnPostexecute'我正在progressDialog.dismiss(); ...我會更新我的問題。 – 2012-02-29 03:13:04

+0

我已更新我的代碼,現在我得到不同的錯誤 – 2012-02-29 03:27:17

2

doInBackground作品,所以你將無法在此方法來更新UI。

如果您想要更新用戶界面,您需要在您的ASyncTask中實現onPostExecute以顯示對話框(或類似的東西)以通知用戶是否發生了錯誤。

編輯:

在你的代碼示例,你不應該在doInBackground顯示敬酒。相反,如果您在doInBackground中遇到異常,您可以return null。在您的onPostExecute中,如果您的結果爲空,則顯示敬酒。