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

时间:2013-05-03 13:07:32

标签: java marmalade

我正在尝试为我的Android游戏添加USB控制器支持。我正在使用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()代码。但是,正如您所看到的,添加它只会给我带来同样的错误。

我对Java没有经验,我对如何解决这个问题感到茫然。任何帮助将不胜感激。

干杯, 史蒂夫

2 个答案:

答案 0 :(得分:1)

Looper(消息队列处理器)绑定到单个线程,每个线程最多只有一个looper。 Handler需要使用Looper进行注册才能正常工作,因此每次调用new Handler()时,它都会尝试获取当前线程的Looper(正在创建的线程) Handler),可以是否存在。抛出的异常是因为创建处理程序的线程没有looper。

你可以做两件事来解决这个问题:

  • Looper添加到当前主题。
  • 确保您在已有Handler的帖子上创建Looper

在几乎所有情况下,处理程序用于从后台线程到UI线程进行通信,我假设这是这种情况。这意味着选项2.您的runOnUiThread(Runnable)事物很接近,但没有雪茄,因为它只是写入日志文件。

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

请注意,根据您的初始化顺序,这可能意味着您的后台线程最初会null,因此后台代码必须能够处理。

答案 1 :(得分:0)

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