1

我正在尝试将 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()代码。但是,如您所见,添加它只会给我同样的错误。

我没有使用 Java 的经验,我不知道如何解决这个问题。任何帮助将不胜感激。

干杯,史蒂夫

4

2 回答 2

1

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

您可以做两件事来解决此问题:

  • 将 a 添加Looper到当前线程。
  • 确保您在Handler已经有Looper.

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

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

请记住,根据您的初始化顺序,这可能意味着它最初null是由您的后台线程看到的,因此后台代码必须能够处理它。

于 2013-05-03T13:54:12.453 回答
0

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

于 2013-05-04T20:59:40.540 回答