我正在尝试为我的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没有经验,我对如何解决这个问题感到茫然。任何帮助将不胜感激。
干杯, 史蒂夫
答案 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
,才能有一个回调方法并将其标记为主线程。