2012-02-29 94 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中,如果您的结果为空,则显示敬酒。