我正在尝试使用OkHttp从Android应用中的网络服务器下载文件。在使用Android Studio(API级别28)创建新项目后,我添加了一个按钮,并将ImageView添加到我的Activity中。我的想法是在按下按钮并在屏幕上显示图像时下载图像。
我正在使用最新版本的OkHttp,3.14.0。
我将<uses-permission android:name="android.permission.INTERNET"/>
添加到AndroidManifest.xml文件中。
我试着完全按照examples中的描述使用OkHttpClient。这就是我的代码:
public class MainActivity extends AppCompatActivity {
... // onCreate method
public void btnClicked(View view) {
new DownloadImageAsyncTask().execute("https://link.to/image.jpg");
}
public class DownloadImageAsyncTask extends AsyncTask<String, Void, Bitmap> {
OkHttpClient client = new OkHttpClient();
... // override doInBackground()
}
}
当我运行应用程序并按下按钮时,执行btnClicked()
方法并且应用程序崩溃。调用OkHttpClient()
时会发生错误,无论我将它作为DownloadImageAsyncTask
类中的字段放置,作为doInBackground()
方法的局部变量放置还是作为ManActivity
类中的字段放置。
我也尝试使用Builder(qazxsw poi)初始化对象,但结果相同。
这是堆栈跟踪:
new OkHttpClient.Builder().build()
OkHttp 3.13+需要Java 8+或Android 5+。我认为您遇到过ART运行时不期望Java 8 lambda的情况。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myapp.httpstuff, PID: 17796
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.BootstrapMethodError: Exception from call site #4 bootstrap method
at okhttp3.internal.Util.<clinit>(Util.java:87)
at okhttp3.internal.Util.immutableList(Util.java:234)
at okhttp3.OkHttpClient.<clinit>(OkHttpClient.java:124)
at com.myapp.httpstuff.MainActivity$DownloadImageAsyncTask.<init>(MainActivity.java:31)
at com.myapp.httpstuff.MainActivity.btnClicked(MainActivity.java:26)
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassCastException: Bootstrap method returned null
at okhttp3.internal.Util.<clinit>(Util.java:87)
at okhttp3.internal.Util.immutableList(Util.java:234)
at okhttp3.OkHttpClient.<clinit>(OkHttpClient.java:124)
at com.myapp.httpstuff.MainActivity$DownloadImageAsyncTask.<init>(MainActivity.java:31)
at com.myapp.httpstuff.MainActivity.btnClicked(MainActivity.java:26)
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
https://android.googlesource.com/platform/art/+/master/runtime/interpreter/interpreter_common.cc#1399
您可能已成功更新build.gradle。
Handle<mirror::Object> object(hs.NewHandle(result.GetL()));
if (UNLIKELY(object.IsNull())) {
// This will typically be for LambdaMetafactory which is not supported.
ThrowClassCastException("Bootstrap method returned null");
return nullptr;
}
android {
compileOptions {
targetCompatibility = "8"
sourceCompatibility = "8"
}
}
在尝试了我想到的所有内容之后,我尝试使用旧版本的OkHttp。
使用https://github.com/square/okhttp/issues/4597代替,我的代码按预期工作。
我刚刚测试了OkHttp:2.7.2
,这也解决了这个问题。
有趣的是Okhttp3:3.12.2
在OkHttp3:3.12.2
(OkHttp3:3.14.0
)后一天被释放