我正在尝试开发Android Wear应用并从移动助手活动传递资产。我已经按照官方文档传递了资产 - 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:不得在UI线程上调用blockingConnect 在com.google.android.gms.common.internal.zzx.zza(未知来源) 在com.google.android.gms.common.api.internal.zzj.blockingConnect(未知来源) ...
关于导致这种情况的任何想法?
答案 0 :(得分:5)
最终解决方案是在runnable中执行loadBitmapFromAsset。不知道为什么我之前没有弄明白这一点......我没有找到类似的帖子,所以希望它会帮助别人。
new Thread(new Runnable() {
@Override
public void run() {
...
}
}).start();
答案 1 :(得分:0)
错误消息的含义正是它所说的:您无法在应用程序的UI线程上调用GoogleApiClient.blockingConnect
。您需要在连接到GoogleApiClient
之前设置回调,然后在onConnected
回调中进行处理。
http://developer.android.com/training/wearables/data-layer/accessing.html有一个很好的例子。您遗失的部分在addConnectionCallbacks
电话中。
答案 2 :(得分:0)
将其放在活动中以创建异步任务
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()
}
})
}