繁体   English   中英

无法在未调用Looper.prepare()的线程内创建处理程序-Android Marmalade

[英]Can't create handler inside thread that has not called Looper.prepare() - Android Marmalade

我正在尝试将USB控制器支持添加到我的Android游戏中。 我正在使用Marmalade,并且已基于USB示例代码创建了扩展。 这里是:

public class GameControllerInput extends Activity
             implements InputManager.InputDeviceListener 
{
    private static final String TAG = "GameControllerInput";

    private InputManager mInputManager;
    private SparseArray<InputDeviceState> mInputDeviceStates;

    private static int numEvents = 0;


    public int EDK_GameControllerInput_Init()
    {
        LoaderActivity.m_Activity.runOnUiThread(new Runnable() 
        {
        public void run()
        {
            Log.i(TAG, "Running 1 =========================");
        }
    });
    Log.i(TAG, "Init 2 =========================");
    return 1;

当我调用init函数时,出现以下错误:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

我读过其他有此错误的线程,他们说解决方案是添加LoaderActivity.m_Activity.runOnUiThread(new Runnable()代码。但是,如您所见,添加LoaderActivity.m_Activity.runOnUiThread(new Runnable()会给我同样的错误。

我没有Java经验,而且对如何解决这个问题一无所知。 任何帮助将不胜感激。

干杯,史蒂夫

Looper (消息队列处理器)绑定到单个线程,每个线程最多具有一个Looper Handler需要向Looper注册才能工作,因此,每次调用new Handler() ,它都会尝试获取当前线程(正在创建Handler的线程)的Looper ,该线程可以存在也可以不存在。 因为创建处理程序的线程没有循环程序,所以引发了您看到的异常。

您可以执行以下两项操作来解决此问题:

  • Looper添加到当前线程。
  • 确保在已经具有Looper的线程上创建Handler

在几乎所有情况下,处理程序都用于从后台线程与UI线程进行通信,我假设情况就是如此。 这意味着选项2。您的runOnUiThread(Runnable)内容很近,但是没有雪茄,因为它所做的全部就是写入日志文件。

您需要将创建new Handler()的代码(未在发布的代码示例中显示)移动到runOnUiThread块中,或使用其他方法使其在UI线程上运行。 执行此操作的典型方法是在您的活动或片段的onCreate(Bundle)方法中创建它。

请记住,根据您的初始化顺序,这可能意味着它最初是null如您的后台线程所见),因此后台代码必须能够处理该问题。

最好有一个回调方法,仅在s4e文件中的方法声明之后调用run_on_os_thread ,将其标记为主线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM