为什么 bindservice 在将其移动到工作线程后仍会导致应用 ANR

Dan*_*iel 4 multithreading android

我在 onCreate 中有一个需要很长时间的 bindservice,我试图通过将它移动到一个工作线程来解决这个问题,但它仍然导致 UI 等待。我能做什么

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


        new Thread(){
            public void run(){
                android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);

                Intent serviceIntent = new Intent(getApplicationContext(), Recognizer.class);
                bindService(serviceIntent, mConnection,Context.BIND_AUTO_CREATE);
            }
        }.start();
}
Run Code Online (Sandbox Code Playgroud)

Che*_*eng 5

从你的描述来看,bindService在UI线程内调用似乎不是ANR的根本原因。相反,您应该在bindService不生成用户线程的情况下调用。一个主要原因是,这会导致内存泄漏。

当配置发生变化时,只要线程还活着,它就不会给Activity执行垃圾收集的机会。这是因为您的用户线程仍然持有对Activity.

ANR 根本原因应该来自RecognizermConnection。如果您可以发布它们的实现细节,这可以帮助我们为您提供帮助。

问自己以下问题

  1. 您是否在 mConnection 中执行任何 I/O 密集型任务onServiceConnected
  2. 您是否在 Recognizer's 中执行任何 I/O 密集型任务onCreate
  3. ...