线程以未捕获的异常退出,AyncTask #2 致命错误

Posted

技术标签:

【中文标题】线程以未捕获的异常退出,AyncTask #2 致命错误【英文标题】:Thread exiting with uncaught exception, AyncTask #2 Fatal Error 【发布时间】:2016-04-10 17:50:52 【问题描述】:

我正在尝试制作一个 RSS 新闻阅读器应用程序,并且我正在使用 AsyncTask 来使用线程将新网站添加到 RSS 提要列表中。但是每当我输入新的 URL 并按“添加”时,应用程序就会崩溃。 LogCat 说 --

threadid 12:线程以未捕获的异常退出”、“AsyncTask #2 FATAL EXCEPTION”和 java.Lang.RuntimeException:执行 doInBackground() 时出错

请帮忙! (P.S. 我正在使用 ADT。)

package com.rssnews;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.lang.Exception;

public class AddNewFeed extends Activity 
Button btnSubmit;
Button btnCancel;
EditText txtUrl;
TextView textViewMessage;

RSSParser rssParser = new RSSParser();
RSSFeed rssFeed;

private ProgressDialog pDialog;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.addnewfeed);

    btnSubmit = (Button) findViewById(R.id.btnSubmit);
    btnCancel = (Button) findViewById(R.id.btnCancel);
    txtUrl = (EditText) findViewById(R.id.txtUrl);
    textViewMessage = (TextView) findViewById(R.id.textViewMessage);

    btnSubmit.setOnClickListener(new View.OnClickListener() 
        public void onClick(View v) 
            try
            String url = txtUrl.getText().toString();
            Log.d("URL Length", "" + url.length());
            if (url.length() > 0) 
                textViewMessage.setText("");
                String urlPattern = "^http(s0,1)://[a-zA-Z0-9_/\\-\\.]+\\.([A-Za-z/]2,5)[a-zA-Z0-9_/\\&\\?\\=\\-\\.\\~\\%]*";
                if (url.matches(urlPattern)) 
                    new loadRSSFeed().execute(url);
                 else 
                    textViewMessage.setText("Please enter a valid url");
                
             else 
                textViewMessage.setText("Please enter website url");
            
            catch(Exception e)
                finish();
            
        
    );

    btnCancel.setOnClickListener(new View.OnClickListener() 
        public void onClick(View v) 
            finish();
        
    );


/**
 * Background Async Task to get RSS data from URL
 * */
class loadRSSFeed extends AsyncTask<String, String, String> 

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() 
        super.onPreExecute();
        pDialog = new ProgressDialog(AddNewFeed.this);
        pDialog.setMessage("Fetching RSS Information ...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();

    

    /**
     * getting
     * */
    @Override
    protected String doInBackground(String... args) 
        String url = args[0];
        rssFeed = rssParser.getRSSFeed(url);
        Log.d("rssFeed", " " + rssFeed);
        if (rssFeed != null) 
            Log.e("RSS URL",
                    rssFeed.getTitle() + "" + rssFeed.getLink() + ""
                            + rssFeed.getDescription() + ""
                            + rssFeed.getLanguage());
            RSSDatabaseHandler rssDb = new RSSDatabaseHandler(
                    getApplicationContext());
            WebSite site = new WebSite(rssFeed.getTitle(),
                    rssFeed.getLink(), rssFeed.getRSSLink(),
                    rssFeed.getDescription());
            rssDb.addSite(site);
            Intent i = new Intent(getApplicationContext(),
                    RSSNewsReaderPBActivity.class);
            // send result code 100 to notify about product update
            setResult(100, i);
            startActivity(i);
            return null;
         else 
            runOnUiThread(new Runnable() 
                public void run() 
                    textViewMessage
                            .setText("Rss url not found. Please check the url or try again");
                
            );
        
        return null;
    

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String args) 
        pDialog.dismiss();
        runOnUiThread(new Runnable() 
            public void run() 
                if (rssFeed != null) 
                
            
        );
    


@Override
protected void onPause() 
    super.onPause();
    //pDialog.dismiss();
    finish();


@Override
public void onBackPressed() 
    finish();

04-10 13:28:50.250: W/dalvikvm(1853): threadid=12: thread exiting with uncaught exception (group=0xb1a1bb90)
04-10 13:28:50.350: E/AndroidRuntime(1853): FATAL EXCEPTION: AsyncTask #2
04-10 13:28:50.350: E/AndroidRuntime(1853): Process: com.rssnews, PID: 1853
04-10 13:28:50.350: E/AndroidRuntime(1853): java.lang.RuntimeException: An error occured while executing doInBackground()
04-10 13:28:50.350: E/AndroidRuntime(1853):     at android.os.AsyncTask$3.done(AsyncTask.java:300)
04-10 13:28:50.350: E/AndroidRuntime(1853):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
04-10 13:28:50.350: E/AndroidRuntime(1853):     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
04-10 13:28:50.350: E/AndroidRuntime(1853):     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
04-10 13:28:50.350: E/AndroidRuntime(1853):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
04-10 13:28:50.350: E/AndroidRuntime(1853):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
04-10 13:28:50.350: E/AndroidRuntime(1853):     at java.lang.Thread.run(Thread.java:841)
04-10 13:28:50.350: E/AndroidRuntime(1853): Caused by: java.lang.NoClassDefFoundError: org.jsoup.Jsoup
04-10 13:28:50.350: E/AndroidRuntime(1853):     at com.rssnews.RSSParser.getRSSLinkFromURL(RSSParser.java:129)
04-10 13:28:50.350: E/AndroidRuntime(1853):     at com.rssnews.RSSParser.getRSSFeed(RSSParser.java:52)
04-10 13:28:50.350: E/AndroidRuntime(1853):     at com.rssnews.AddNewFeed$loadRSSFeed.doInBackground(AddNewFeed.java:90)
04-10 13:28:50.350: E/AndroidRuntime(1853):     at com.rssnews.AddNewFeed$loadRSSFeed.doInBackground(AddNewFeed.java:1)
04-10 13:28:50.350: E/AndroidRuntime(1853):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
04-10 13:28:50.350: E/AndroidRuntime(1853):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-10 13:28:50.350: E/AndroidRuntime(1853):     ... 3 more
04-10 13:28:50.700: I/Choreographer(1853): Skipped 38 frames!  The application may be doing too much work on its main thread.
04-10 13:28:51.880: I/Choreographer(1853): Skipped 95 frames!  The application may be doing too much work on its main thread.
04-10 13:28:55.320: I/Choreographer(1853): Skipped 49 frames!  The application may be doing too much work on its main thread.
04-10 13:28:56.280: I/Choreographer(1853): Skipped 96 frames!  The application may be doing too much work on its main thread.
04-10 13:28:57.920: E/WindowManager(1853): android.view.WindowLeaked: Activity com.rssnews.AddNewFeed has leaked window com.android.internal.policy.impl.PhoneWindow$DecorViewb2524248 V.E..... R.....I. 0,0-563,230 that was originally added here
04-10 13:28:57.920: E/WindowManager(1853):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:346)
04-10 13:28:57.920: E/WindowManager(1853):  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
04-10 13:28:57.920: E/WindowManager(1853):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
04-10 13:28:57.920: E/WindowManager(1853):  at android.app.Dialog.show(Dialog.java:286)
04-10 13:28:57.920: E/WindowManager(1853):  at com.rssnews.AddNewFeed$loadRSSFeed.onPreExecute(AddNewFeed.java:80)
04-10 13:28:57.920: E/WindowManager(1853):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
04-10 13:28:57.920: E/WindowManager(1853):  at android.os.AsyncTask.execute(AsyncTask.java:535)
04-10 13:28:57.920: E/WindowManager(1853):  at com.rssnews.AddNewFeed$1.onClick(AddNewFeed.java:45)
04-10 13:28:57.920: E/WindowManager(1853):  at android.view.View.performClick(View.java:4424)
04-10 13:28:57.920: E/WindowManager(1853):  at android.view.View$PerformClick.run(View.java:18383)
04-10 13:28:57.920: E/WindowManager(1853):  at android.os.Handler.handleCallback(Handler.java:733)
04-10 13:28:57.920: E/WindowManager(1853):  at android.os.Handler.dispatchMessage(Handler.java:95)
04-10 13:28:57.920: E/WindowManager(1853):  at android.os.Looper.loop(Looper.java:137)
04-10 13:28:57.920: E/WindowManager(1853):  at android.app.ActivityThread.main(ActivityThread.java:4998)
04-10 13:28:57.920: E/WindowManager(1853):  at java.lang.reflect.Method.invokeNative(Native Method)
04-10 13:28:57.920: E/WindowManager(1853):  at java.lang.reflect.Method.invoke(Method.java:515)
04-10 13:28:57.920: E/WindowManager(1853):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
04-10 13:28:57.920: E/WindowManager(1853):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
04-10 13:28:57.920: E/WindowManager(1853):  at dalvik.system.NativeStart.main(Native Method)
04-10 13:28:57.980: I/Choreographer(1853): Skipped 62 frames!  The application may be doing too much work on its main thread.
04-10 13:29:00.400: I/Process(1853): Sending signal. PID: 1853 SIG: 9

【问题讨论】:

你能试着清理一下你的问题吗? (您发布日志和输出很好,但格式使您很难阅读和理解您的问题。) 【参考方案1】:

您正试图从后台线程(在doInBackground 方法中)启动一个活动,这就是您的应用程序崩溃的原因。您应该将该代码添加到onPostExecute

protected void onPostExecute(String args) 
    pDialog.dismiss();
    Intent i = new Intent(getApplicationContext(), RSSNewsReaderPBActivity.class);
    setResult(100, i);
    startActivity(i);

【讨论】:

以上是关于线程以未捕获的异常退出,AyncTask #2 致命错误的主要内容,如果未能解决你的问题,请参考以下文章

以未捕获的异常终止:NSException

实例化 NSFetchedResultsController 以未捕获的异常终止

无法在 aynctask 中未调用 Looper.prepare() 异常的线程内创建处理程序

从线程捕获异常时退出程序

当其中一个线程中存在未捕获的异常时,Python 多线程程序不会退出

Android视图:未捕获的处理程序:线程主因未捕获的异常而退出