在wear服务中调用blockingConnect时出现IllegalStateException异常

3
我正在尝试开发一个Android Wear应用程序,并从移动助手活动中传递资产。我已经按照官方文档传输资产的要求进行了操作,但是当我尝试从传递的资产中加载位图时,在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 at com.google.android.gms.common.internal.zzx.zza(Unknown Source) at com.google.android.gms.common.api.internal.zzj.blockingConnect(Unknown Source) ...

有什么想法是什么导致了这个错误?
3个回答

5

最终的解决方案是在一个可运行的环境中执行loadBitmapFromAsset。不知道为什么我之前没有想到这个...我没有找到类似的帖子,希望它能帮助到其他人。

new Thread(new Runnable() {
    @Override
    public void run() {
    ...
    }
}).start();

0
将以下代码放入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()

            }

        })
 }

0

这个错误信息的意思就是:你不能在应用程序的UI线程上调用GoogleApiClient.blockingConnect。在连接到GoogleApiClient之前,您需要设置一个回调,然后在onConnected回调中进行处理。

http://developer.android.com/training/wearables/data-layer/accessing.html中有一个很好的例子。你缺少的部分在addConnectionCallbacks调用中。


谢谢,但这就是我正在做的。手表表盘服务实现了以下功能:DataApi.DataListener、GoogleApiClient.ConnectionCallbacks和GoogleApiClient.OnConnectionFailedListener。问题发生在调用onDataChanged函数时(在移动配套应用程序上更改一些设置后),并且我尝试从传递的资源中加载位图时。我正在使用的函数是相关文档中相同的函数(loadBitmapFromAsset):http://developer.android.com/intl/ru/training/wearables/data-layer/assets.html - a.p.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接