在wear Service中调用blockingConnect时出现IllegalStateException

时间:2016-04-04 14:53:30

标签: android assets wear-os illegalstateexception

我正在尝试开发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(未知来源)   ...

关于导致这种情况的任何想法?

3 个答案:

答案 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()

            }

        })
 }