在磨损服务中调用 blockingConnect 时出现 IllegalStateException
IllegalStateException when calling blockingConnect in wear Service
我正在尝试开发一个 Android 穿戴应用程序并从移动助手 activity 传递一个资产。我遵循了传递资产的官方文档 - Transferring Assets,但是在尝试从 onDataChanged
函数中传递的资产加载位图时出现以下错误。请注意,代码在传递 String
值时有效。代码如下:
public Bitmap loadBitmapFromAsset(Bitmap bitmap, Asset asset) {
if (asset == null) {
throw new IllegalArgumentException("Asset must be non-null");
}
ConnectionResult result = mGoogleApiClient.blockingConnect(5000, TimeUnit.MILLISECONDS);
if (!result.isSuccess()) {
return null;
}
InputStream assetInputStream = Wearable.DataApi.getFdForAsset(mGoogleApiClient, asset).await().getInputStream();
mGoogleApiClient.disconnect();
if (assetInputStream == null) {
return null;
}
if (bitmap != null) {
bitmap.recycle();
bitmap = null;
}
bitmap = BitmapFactory.decodeStream(assetInputStream);
return bitmap;
}
我收到的错误如下:
java.lang.IllegalStateException: blockingConnect must not be called on the UI thread
at com.google.android.gms.common.internal.zzx.zza(Unknown Source)
at com.google.android.gms.common.api.internal.zzj.blockingConnect(Unknown Source)
...
关于造成这种情况的原因有什么想法吗?
错误消息的意思与它所说的完全相同:您不能在应用程序的 UI 线程上调用 GoogleApiClient.blockingConnect
。您需要在连接到 GoogleApiClient
之前设置回调,然后在 onConnected
回调中进行处理。
http://developer.android.com/training/wearables/data-layer/accessing.html 上有一个很好的例子。您缺少的部分在 addConnectionCallbacks
调用中。
最终的解决方案是在可运行文件中执行 loadBitmapFromAsset。不明白为什么我没有早点弄清楚...我还没有找到类似的 post 所以希望它能帮助别人。
new Thread(new Runnable() {
@Override
public void run() {
...
}
}).start();
将其放入 Activity 以创建异步任务
class doAsync(val handler: () -> Unit) : AsyncTask<Void, Void, Void>() {
init {
execute()
}
override fun doInBackground(vararg params: Void?): Void? {
handler()
return null
}
}
现在在 onResume 或 onCreate 中调用它
doAsync{
mGoogleApiClient?.blockingConnect()
Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(object : ResultCallback<Status> {
override fun onResult(status: Status) {
mAuth?.signOut()
}
})
}
我正在尝试开发一个 Android 穿戴应用程序并从移动助手 activity 传递一个资产。我遵循了传递资产的官方文档 - Transferring Assets,但是在尝试从 onDataChanged
函数中传递的资产加载位图时出现以下错误。请注意,代码在传递 String
值时有效。代码如下:
public Bitmap loadBitmapFromAsset(Bitmap bitmap, Asset asset) {
if (asset == null) {
throw new IllegalArgumentException("Asset must be non-null");
}
ConnectionResult result = mGoogleApiClient.blockingConnect(5000, TimeUnit.MILLISECONDS);
if (!result.isSuccess()) {
return null;
}
InputStream assetInputStream = Wearable.DataApi.getFdForAsset(mGoogleApiClient, asset).await().getInputStream();
mGoogleApiClient.disconnect();
if (assetInputStream == null) {
return null;
}
if (bitmap != null) {
bitmap.recycle();
bitmap = null;
}
bitmap = BitmapFactory.decodeStream(assetInputStream);
return bitmap;
}
我收到的错误如下:
java.lang.IllegalStateException: blockingConnect must not be called on the UI thread at com.google.android.gms.common.internal.zzx.zza(Unknown Source) at com.google.android.gms.common.api.internal.zzj.blockingConnect(Unknown Source) ...
关于造成这种情况的原因有什么想法吗?
错误消息的意思与它所说的完全相同:您不能在应用程序的 UI 线程上调用 GoogleApiClient.blockingConnect
。您需要在连接到 GoogleApiClient
之前设置回调,然后在 onConnected
回调中进行处理。
http://developer.android.com/training/wearables/data-layer/accessing.html 上有一个很好的例子。您缺少的部分在 addConnectionCallbacks
调用中。
最终的解决方案是在可运行文件中执行 loadBitmapFromAsset。不明白为什么我没有早点弄清楚...我还没有找到类似的 post 所以希望它能帮助别人。
new Thread(new Runnable() {
@Override
public void run() {
...
}
}).start();
将其放入 Activity 以创建异步任务
class doAsync(val handler: () -> Unit) : AsyncTask<Void, Void, Void>() {
init {
execute()
}
override fun doInBackground(vararg params: Void?): Void? {
handler()
return null
}
}
现在在 onResume 或 onCreate 中调用它
doAsync{
mGoogleApiClient?.blockingConnect()
Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(object : ResultCallback<Status> {
override fun onResult(status: Status) {
mAuth?.signOut()
}
})
}