【问题标题】:How to cancel doInBackground in AsyncTask如何在 AsyncTask 中取消 doInBackground
【发布时间】:2015-07-16 08:11:08
【问题描述】:

这是我的代码:

class XMLDownload extends AsyncTask<URL, Void, ArrayList<HashMap<String, String>>> {

    @Override
    protected ArrayList<HashMap<String, String>> doInBackground(URL... urls) {
        if (cd.isConnectingToInternet()) {
            URL url = urls[0];
            XMLParser xmlParser = new XMLParser();
            String xml = xmlParser.getXMLFromUrl(url);

            Document doc = xmlParser.getDomElement(xml);
            if (doc == null){
                Toast.makeText(context,"Falsche URL",Toast.LENGTH_SHORT).show();                  
            } else {
                writeToFile(xml, "xmlfilesnames" + ".kx_todo");
                [...]
    }

    @Override
    protected void onPostExecute(ArrayList<HashMap<String, String>> xmlItems) {
        if (cd.isConnectingToInternet()) {
            CustomAdapterProjects adapter = new CustomAdapterProjects(ListViewActivity.context, projectItems);
            setListAdapter(adapter);
        }
    }
}

如果用户提供了错误的 URL 并且doc 为空。然后我想展示一个 Toast。

我已经阅读了一些关于取消 AsyncTask 的其他主题,但这是更独特的,因为我在 doInBackground 方法内有一个 NPE,而不是其他地方。

如何取消doInBackground 方法。继续这个方法是没有意义的。否则我会得到很多 NPE (NullPointerException)。

【问题讨论】:

    标签: java android android-asynctask


    【解决方案1】:
    if (doc == null) {
      return null;
    }
    

    onPostExecute 检查xmlItems 是否为空。如果为空,则显示Toast

    【讨论】:

    • 我的问题是如何取消 doInBackground 方法的继续。如果它继续,我会因为 doc == null 而得到越来越多的 NPE...如果我返回 null...我的应用程序不会崩溃吗?
    • 如果 doc 为 null 并且您返回,则执行流程从 onPostExecute 继续。检查参数是否为空。它是空的,显示吐司,什么也不做。并且,请从 doInBackground 中删除 Toast
    【解决方案2】:

    如何取消 doInBackground 方法。继续这个方法是没有意义的。否则我会得到很多 NPE (NullPointerException)。

    您只需致电xMLDownload.cancel(true); 即可取消您的AsyncTask

    【讨论】:

    • 当你创建像 XMLDownload xMLDownload = new XMLDownload(); xMLDownload.execute(); 这样的异步任务对象时,请将此 xMLDownload 实例变量。每当您想取消异步任务时,请致电xMLDownload.cancel(true)
    【解决方案3】:

    如果 urldoc 中的任何一个为 null,则返回 null。

    if(doc == null || url == null){
      return null;
    }
    

    然后在onPostExceute 你可以做任何你想做的事情。

    【讨论】:

    • 如果你返回null,执行将来到onPostExecute方法,你可以检查你的Arraylist参数是否为空,然后在此基础上你可以实现你的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2012-11-27
    • 1970-01-01
    • 2017-02-23
    • 2013-11-03
    • 1970-01-01
    相关资源
    最近更新 更多