Android onCreate死锁

Shookit

我在弄清楚如何正确组织特定的android代码方面遇到一些问题。

这是代码的体系结构:在活动的onCreate内,addService通过bindService进行一些工作,只有在onServiceConnected方法成功完成后才能运行getServices:

public class MyClass{
    List<IBinder> binders = new ArrayList<IBinder>;
    int stillSettingUp = 0;

    public void addService(Class<?> cls) {
        //Adds a binder via bindService 
        ServiceConnection mConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName className, IBinder service) {
                //Callback for service being successfully started
                binders.add(service);
                stillSettingUp--;
            }
        };

        //Increment count of the number of services being set up
        stillSettingUp++;
        Intent intent = new Intent(context, cls);
        context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

    public List<IBinder> getServices(){
        while (stillSettingUp != 0) {
            Log.w("", "Waiting for services to successfully connect... " + stillSettingUp);
            Thread.sleep(1000);
        }
        return binders;
    }
}

困难在于:第二种方法需要onServiceConnected函数来完成。在整个onCreate函数完成之前,onServiceConnected函数无法执行(因为它们是固定在主循环末尾的事件,在当前事件完成之前无法执行),因此系统死锁。

有没有一种方法可以强制处理UI线程上的其他事件,或者是更好的协调代码的方法?我试图避免每次我一起调用这两段代码时都运行AsyncTask,因为这需要向调用代码公开线程要求。但是,这很困难,因为您不能强制服务连接回调在其自己的线程中执行。欢迎任何建议。

Shookit

这是我的问题要点:

1)如果您必须依赖Android回调中的数据,则不应阻塞,因为Android回调不会像其他编程范例中那样发布到单独的线程中。相反,您应该优雅地移到需要数据的位置,可能会重新尝试通过轮询线程进行数据访问。

2)您也可以传递一个可运行的内容,以在连接服务后执行。但是,这可能会变得非常混乱。

3)不要使用太多服务。通常,仅使用一个或两个服务比使用一堆相互通信的服务要容易得多。我重写了这组代码,由于我不经常处理绑定服务,因此可维护性提高了20倍。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android onResume和onCreate

来自分类Dev

android oncreate如何工作?

来自分类Dev

Android应用黑屏(onCreate())

来自分类Dev

Android的onCreate中的NullPointerException

来自分类Dev

Android onCreate extras

来自分类Dev

Android-活动onCreate和片段onCreate

来自分类Dev

在Eclipse中的Android上调试死锁

来自分类Dev

什么是Android中的OnCreate方法

来自分类Dev

Android 10 Activity onCreate崩溃

来自分类Dev

Android为什么在onCreate上显示文本

来自分类Dev

Android SharedPreferences在Activity oncreate上为空

来自分类Dev

Android backstack在onCreate方法中为null

来自分类Dev

停止onCreate在Android屏幕旋转时执行

来自分类Dev

Android showDropDown onCreate无法正常工作

来自分类Dev

Android中onCreate片段中的setRetainInstance(true)

来自分类Dev

Android-在onCreate之前更改类变量

来自分类Dev

onCreate中的setText()导致崩溃(android)

来自分类Dev

用onCreate()替换android构造函数

来自分类Dev

Android的SQLite的,的onCreate()不会被调用

来自分类Dev

onCreate ListView错误:不是声明-Android

来自分类Dev

从oncreate函数内部调用外部函数(Android)

来自分类Dev

活动的onCreate中的Android启动服务问题

来自分类Dev

无法在oncreate android外部访问textview或getLayoutInflater()

来自分类Dev

在onCreate之后调用Android onStop onDestroy

来自分类Dev

Android onCreate()-方法不起作用

来自分类Dev

在onActivityResult()之后调用的Android openFileChooser onCreate()

来自分类Dev

Android SharedPreferences在Activity oncreate上为空

来自分类Dev

Android:未按返回按钮onCreate方法

来自分类Dev

Android Studio活动-使用onCreate(),onResume()等

Related 相关文章

热门标签

归档