当前位置: 首页 > 知识库问答 >
问题:

带有Jsoup的Android AsyncTask在发布版本时崩溃

傅峰
2023-03-14

我让这个类来检查playsore中是否有可用的更新,它使用了Jsoup,所有的东西都在debug上,但是当我上传release版本时,它会崩溃,我真的不知道是什么问题。有人能帮我吗?

致命的例外:java。lang.RuntimeException:在android上执行doInBackground()时出错。操作系统。3美元。在java上完成(AsyncTask.java:365)。util。同时发生的未来任务。在java完成(FutureTask.java:383)。util。同时发生的未来任务。java上的setException(FutureTask.java:252)。util。同时发生的未来任务。在java上运行(FutureTask.java:271)。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1162)。util。同时发生的ThreadPoolExecutor$Worker。在java上运行(ThreadPoolExecutor.java:636)。朗。丝线。run(Thread.java:784)

由java.lang.引起的异常在org.jsoup.nodes.Entities.access0美元(Entities.java: 1)在org.jsoup.nodes.实体$逃逸模式。(Entities.java: 1)在org.jsoup.nodes.文档$输出设置。(Document.java: 3)在org.jsoup.nodes.文档。(Document.java:11)在org.jsoup.parser.TreeBuilder. a(TreeBuilder.java:12)在org.jsoup.parser.TreeBuilder.runParser(TreeBuilder.java)在org.jsoup.parser.Tokeniser.acknowledgeSelfCloSingFags(Tokeniser.java: 7)在org.jsoup.parser.HtmlTreeBuilder.insert空(HtmlTreeBuilder. java: 7)在org. jsou. parser. parseInput(Parser. java: 5)在org. jsou. helper. DataUtili. parseByteData(DataUtili. java: 6)在org. jsou. helper. HttpConnection$响应. parse(HttpConnection. java: 7)在org. jsou. helper. HttpConnec. java(HttpConnection. java: 7)在com. square. android. buyer. GetVersionCode. doInbackground(GetVersionCode. java: 7)在android. os. AsyncTask2美元. call(AsyncTask. java: 345)在java

由java引起的。lang.NullPointerException:尝试调用虚拟方法“int java”。伊奥。读者在java上对空对象引用读取(char[])。util。属性$LineReader。java上的readLine(Properties.java:432)。util。财产。在java上加载0(Properties.java:348)。util。财产。在org上加载(Properties.java:336)。jsoup。节点。实体。a(Entities.java:16)位于org。jsoup。节点。实体。(Entities.java:82)位于org。jsoup。节点。实体。在org上访问$000(Entities.java:1)。jsoup。节点。实体$EscapeMode。(Entities.java:1)位于org。jsoup。节点。记录$OutputSettings。(Document.java:3)位于org。jsoup。节点。文件(Document.java:11)在org上。jsoup。解析器。TreeBuilder。a(TreeBuilder.java:12)位于org。jsoup。解析器。TreeBuilder。org上的runParser(TreeBuilder.java)。jsoup。解析器。标记器。org上的acknowledgeSelfClosingFlag(Tokeniser.java:7)。jsoup。解析器。HtmlTreeBuilder。insertEmpty(HtmlTreeBuilder.java:7)位于org。jsoup。解析器。解析器。org上的parseInput(Parser.java:5)。jsoup。帮手DataUtil。org上的parseByteData(DataUtil.java:6)。jsoup。帮手HttpConnection$Response。在org上解析(HttpConnection.java:7)。jsoup。帮手HttpConnection。在com上获取(HttpConnection.java:7)。广场Android买主GetVersionCode。android上的doInBackground(GetVersionCode.java:7)。操作系统。2美元。在java上调用(AsyncTask.java:345)。util。同时发生的未来任务。在java上运行(FutureTask.java:266)。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1162)。util。同时发生的ThreadPoolExecutor$Worker。在java上运行(ThreadPoolExecutor.java:636)。朗。丝线。run(Thread.java:784)

public class GetVersionCode extends AsyncTask<Void, String, String> {
    private Activity mActivity;
    private String currentVersion;
    private String packageName;
    private boolean isForceUpdate;

    public GetVersionCode(Activity act, String version, boolean forceUpdate) {
        this.mActivity = act;
        this.currentVersion = version;
        this.isForceUpdate = forceUpdate;
        this.packageName = act.getPackageName();
    }

    @Override
    protected String doInBackground(Void... voids) {
        String newVersion = null;
        try {
            Document document = Jsoup.connect("https://play.google.com/store/apps/details?id=" + packageName + "&hl=en")
                .timeout(30000)
                .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
                .referrer(Utils.HOST_NAME)
                .get();
            if (document != null) {
                Elements element = document.getElementsContainingOwnText("Current Version");
                for (Element ele : element) {
                    if (ele.siblingElements() != null) {
                        Elements sibElemets = ele.siblingElements();
                        for (Element sibElemet : sibElemets) {
                            newVersion = sibElemet.text();
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return newVersion;

    }


    @Override
    protected void onPostExecute(String onlineVersion) {
        super.onPostExecute(onlineVersion);
        if (onlineVersion != null && !onlineVersion.isEmpty()) {
            Log.d("update", "Current version " + currentVersion + " playstore version " + onlineVersion);
           // if(Float.valueOf(currentVersion) < Float.valueOf(onlineVersion)) {
            if(!currentVersion.equals(onlineVersion)) {
                //show anything
                final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mActivity, R.style.AlertDialogStyle);
                String alertMessage = Utils.APP_NAME + " Version " + onlineVersion + " is available on PlayStore.";
                alertDialogBuilder.setTitle("New Version");
                alertDialogBuilder.setMessage( alertMessage );
                alertDialogBuilder.setPositiveButton("UPDATE", (dialog, which) -> {
                    dialog.cancel();
                    try {
                        mActivity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName)));
                    } catch (ActivityNotFoundException anfe) {
                        mActivity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + packageName)));
                    }
                });
                if(!isForceUpdate) {
                    alertDialogBuilder.setNegativeButton("NOT NOW", (dialog, which) -> {
                        dialog.cancel();
                    });
                }else{
                    alertDialogBuilder.setCancelable(false);
                }
                alertDialogBuilder.create().show();
            }
        }
    }
}

用法

 checkForUpdate.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                GetVersionCode gvc = new GetVersionCode(MainActivity.this, BuildConfig.VERSION_NAME, true);
                if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
                    gvc.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
                } else {
                    gvc.execute();
                }
            }
        });
     }
});

共有1个答案

赏彭薄
2023-03-14
 at org.jsoup.nodes.Entities$EscapeMode.(Entities.java:1)

这提醒了我加载属性文件时有一个问题,因为Android资源和类Escape eMode正在使用这些。它在J汤问题#959中得到修复,修复版本1.11.1中发布,所以至少尝试使用这个版本。

 类似资料:
  • 问题内容: 就像我在标题中说的那样,我正在为iPhone编写一个应用程序,该应用程序可以在调试模式下完美运行,但是当我将其构建为发行版并通过TestFlight安装时,它会崩溃。由于崩溃日志,它可能必须使用以下代码行: 我使用的是Brother的框架而不使用AirPrint进行打印,但是我认为这不是问题,因为应用程序在对框架执行某些操作之前便崩溃了。它仅在我执行这些行的ViewController

  • 版本号 采用三位版本号,分别是主版本号、次版本号、修订版本号。例如 5.1.2。 参见: http://semver.org/lang/zh-CN/。 主版本号:主版本号内的所有版本必须相互兼容;与其它主版本号不一定完全兼容,尽量向下兼容。 次版本号:代表新特性增强。版本号越大特性越丰富。 修订版本号:代表BugFix版本。只做bug修复使用,版本号越大越稳定。 版本维护 最多同时维护两个版本。

  • Im很难通过HTTPS获得java提交POST请求 编辑: 当服务器通过HTTPS获得一个POST时,似乎涉及到302重定向(这在http上不会发生),我如何使用jsoup存储与302一起发送到下一页的cookie呢?

  • 我有一个奇怪的问题,我的调试版本工作正常,但是在签署并生成一个应用程序包后,我将其上传到Play商店,该应用程序立即崩溃(我在具有我的应用程序的商店版本的手机上运行LogCat,我看到它与AndroidX ConstraintLayout有关,但无法复制它)。我认为和版本之间有一些区别,所以我开始调试我的发布版本。 当我这样做时,Android Studio无法安装APK,出现以下错误: 安装失败

  • 我想为一个使用Rcpp的R包创建一个发布版本,但是当我查看的参数时,我发现即使我的Makevars文件中有一个标志,Rcpp也会在最后用一个标志覆盖它,例如,我将其视为输出 g-std=gnu 11-我"/usr/share/R/包含"-DNDEBUG-我"/home/dz5937/R/x86_64-pc-linux-gnu-库/3.6/Rcpp/包含"-我"/home/dz5937/R/x86_