异步任务导致应用程序停止运行

3

我在应用程序中使用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
这是你的实际代码还是只是框架?我没有看到任何可能导致它挂起的东西。它只是发送一个 nullonPostExecute 并停止。 - Geobits
这只是一个框架,但我正在尝试使用与此处编写的doInBackground函数相同的主体来运行我的代码,但它又再次冻结了。 - nabroyan
我刚刚编辑了我的帖子,但问题是它从未到达“onPostExecute”。 - nabroyan
@nabroyan 你确定它不是停在那个方法里而不是没有到达吗?在那个方法的第一行添加 Log.i("onPostExecute", "Started"); 然后看看它是否在 Logcat 中输出。 - whitfin
1
如果它在新线程上运行,断点是否仍然会被调试器捕获? - whitfin
显示剩余6条评论
2个回答

1
您正在尝试通过提供一个nullContext来创建一个AlertDialog。您需要做的是从调用AsyncTaskActivity中传递有效的Context,通过将Context传递给任务的构造函数,然后使用该Context与Dialog一起使用:
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;
}
补充:虽然这不直接涉及到问题,但我认为在这里提及一下很重要,如果您像OP一样在新线程中设置断点,那么您将无法命中它 - 最好使用Log来跟踪进入/退出方法/代码块。

0

看起来你应该会得到一个 NPE 错误。

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

对不起,你说的NPE是什么意思? - nabroyan
@nabroyan 空指针异常 - whitfin
@Zackehh9lives,没错,我返回了null并且exception也是null,然后我尝试使用结果。如果发生异常,则alertDialog = new AlertDialog.Builder(null).create();这一行会导致NPE。所以在这段代码中有很多null - nabroyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接