在磨损服务中调用 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()

            }

        })
 }