AsyncTask停止应用程序

时间:2013-07-29 18:54:03

标签: android android-asynctask

我在我的应用程序中使用AsyncTask,但是当它启动时,它就像它永远不会结束。当我在doInBackground应用程序冻结并且卡在ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker)之后进行调试时。

这是我的代码的结构

class FetchSymbolInfo extends AsyncTask<String, Void, Document> {

        private Exception exception = null;

        @Override
        protected Document doInBackground(String... params) 
        {
            try 
            {
                Document doc = null;
                //doc = Jsoup.connect(params[0]).get();//application freezes even if I remove this line
                return doc;
            } 
            catch (Exception e) 
            {
                this.exception = e;
                return null;
            }
        }

        @Override
        protected void onPostExecute(Document result) 
        {
            if(exception != null)
        {
            AlertDialog alertDialog;
            alertDialog = new AlertDialog.Builder(null).create();//////////
            alertDialog.setTitle("Error");
            alertDialog.setMessage("Could not fetch from internetd\nPlease check your inernet connection and symbol name.");
            alertDialog.show();
            return;
        }

        Elements valueElement = result.select("div#qwidget_lastsale");
        String valueString = valueElement.toString();
        //getting number from string
        }

        @Override
          protected void onPreExecute() {
          }

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

        @Override
        protected void onCancelled(Document result) {
            super.onCancelled(result);
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }

我正试图像这样执行它

String url = "url";  //writing an url
FetchSymbolInfo fetch = new FetchSymbolInfo();
fetch.execute(url);

有什么想法吗?提前谢谢!

2 个答案:

答案 0 :(得分:1)

您尝试通过提供AlertDialog null来创建Context。你需要做的是从调用Activity的{​​{1}}传递一个有效的Context,方法是将Context传递给任务的构造函数,然后将其与Dialog一起使用:

AsyncTask

添加:虽然与问题没有直接关系,但我认为在这里提一下比在OP中设置一个新线程中的断点更重要,你不会碰它 - 你最好使用class FetchSymbolInfo extends AsyncTask<String, Void, Document> { private Context parent; // ... public FetchSymbolInfo(Context c){ parent = c; } // ... if(exception != null){ AlertDialog alertDialog; alertDialog = new AlertDialog.Builder(parent).create(); alertDialog.setTitle("Error"); alertDialog.setMessage("Could not fetch from internetd\nPlease check your inernet connection and symbol name."); alertDialog.show(); return; } 来跟踪进入/退出的方法/代码块。

答案 1 :(得分:0)

它接缝你应该得到NPE。

    Elements valueElement = result.select("div#qwidget_lastsale");