【发布时间】:2018-07-03 11:55:59
【问题描述】:
我在做什么:
在我的应用程序(带有minSdkVersion 15 的Android)中,我有一个BroadcastReceiver 来监听Intent.ACTION_PACKAGE_ADDED(设备上已经安装了一个新的应用程序包)。每当发生这种情况时,接收方都会尝试使用 Jsoup 从互联网获取一些数据。
问题:
只要当我安装另一个应用程序(例如来自 Play 商店)时,我的应用程序在后台运行,我的代码就可以正常工作。但是,如果我杀死 我的应用 然后安装另一个应用,我的应用 崩溃并显示“我的应用已停止”对话框(因为我的接收器崩溃)以及此错误:
No implementation found for long com.android.tools.profiler.support.network.HttpTracker$Connection.nextId() (tried Java_com_android_tools_profiler_support_network_HttpTracker_00024Connection_nextId and Java_com_android_tools_profiler_support_network_HttpTracker_00024Connection_nextId__)
FATAL EXCEPTION: AsyncTask #1
Process: com.myorg.myapp, PID: 11796
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:325)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.UnsatisfiedLinkError: No implementation found for long com.android.tools.profiler.support.network.HttpTracker$Connection.nextId() (tried Java_com_android_tools_profiler_support_network_HttpTracker_00024Connection_nextId and Java_com_android_tools_profiler_support_network_HttpTracker_00024Connection_nextId__)
at com.android.tools.profiler.support.network.HttpTracker$Connection.nextId(Native Method)
at com.android.tools.profiler.support.network.HttpTracker$Connection.<init>(HttpTracker.java:191)
at com.android.tools.profiler.support.network.HttpTracker$Connection.<init>(HttpTracker.java:186)
at com.android.tools.profiler.support.network.HttpTracker.trackConnection(HttpTracker.java:280)
at com.android.tools.profiler.support.network.httpurl.TrackedHttpURLConnection.<init>(TrackedHttpURLConnection.java:49)
at com.android.tools.profiler.support.network.httpurl.HttpsURLConnection$.<init>(HttpsURLConnection$.java:50)
at com.android.tools.profiler.support.network.httpurl.HttpURLWrapper.wrapURLConnectionHelper(HttpURLWrapper.java:40)
at com.android.tools.profiler.support.network.httpurl.HttpURLWrapper.wrapURLConnection(HttpURLWrapper.java:55)
at org.jsoup.helper.HttpConnection$Response.createConnection(HttpConnection.java:889)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:727)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:706)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:299)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:288)
at com.myorg.myapp.InstallReceiver$PlayStoreFetcher.doInBackground(InstallReceiver.java:76)
at com.myorg.myapp.InstallReceiver$PlayStoreFetcher.doInBackground(InstallReceiver.java:70)
at android.os.AsyncTask$2.call(AsyncTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
我的代码:
InstallReceiver.java:
public class InstallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
String data = new FetchData().execute("URL").get();
// The rest of my code...
}
}
private static class FetchData extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... strings) {
try {
// This is the cause of the problem
return Jsoup.connect(strings[0]).get().text();
} catch (Exception e) {
return null;
}
}
}
}
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myorg.myapp">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".Activities.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Activities.PlayStoreActivity"/>
<activity android:name=".Activities.InstalledAppsActivity"/>
<activity android:name=".Activities.PredefinedFiltersActivity"/>
// This is linking my InstallReceiver.java
<receiver android:name=".InstallReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
</application>
</manifest>
build.gradle:
dependencies {
compile 'org.jsoup:jsoup:1.11.2'
// The rest of my dependencies...
}
我的尝试:
- 我用一般的
catch (Exception e)语句包围了 Jsoup 调用,但仍然抛出错误。 - 我查看了这个错误并找到了一些答案,例如 this one 和 this one,但似乎都没有解决我的问题。
- 我将 Jsoup 调用移至
IntentService并从我的InstallReceiver启动该服务,但仍然抛出相同的错误(来自该服务)。 - 尝试使用
(new URL(url)).openConnection()获取 HTML 并得到相同的错误,但现在不是 Jsoup 而是因为URLConnection而显示。 - 使用了
Thread类而不是AsyncTask,但仍然出现同样的错误。
我的尝试暗示该错误与 Jsoup 并没有真正的关系,它与应用程序未运行时从接收器连接到互联网有关!
我猜这个HttpTracker$Connection.nextId() 存在导入问题,当我的应用程序 没有运行时。
知道如何解决这个问题吗?
【问题讨论】:
-
尝试调试时设备已连接?如果是这样,您的堆栈跟踪显示您的 android studio 网络分析器可能有问题您应该向source.android.com/setup/report-bugs 报告并升级您的工作室,如果这无助于尝试使用将日志写入文件进行调试
-
@crazyPixel 即使设备未连接到 Android Studio,我也会遇到同样的错误。我使用logcat应用检查了错误,它是一样的。
-
您支持的最低 SDK 级别是多少?
-
@crazyPixel
minSdkVersion 15 -
你能尝试另一种方式来完成任务吗?尝试使用
HttpClient获取 HTML 内容并使用Jsoup.parse(html).text()(stackoverflow.com/questions/6503574/…) 解析 HTML
标签: java android broadcastreceiver jsoup