0

创建应用程序时,我想做一些长时间的操作(如复制/加载文件)。我为此创建了一个线程,该线程不会更新 UI。我收到一条错误消息,说如果不调用 Looper.prepare() 就无法在线程中创建处理程序。我的代码有什么问题?

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

    threadFileManager = new Thread (
        new Runnable() {
            public void run() {
                FileManager fM = new FileManager();
                fM.copyFileFromAssetToStorage();                
        }
    }); 
    threadFileManager.start();
}

编辑:错误在于我的 FileManager 类,当它是 Activity 的子类时。更改为服务工作。

4

3 回答 3

2

Application班级是做这件事的错误地方。如果需要,可以使用Application'onCreate()方法启动Service. 您应该在 a 中实现此后台线程Service,因为 的目的Service是在后台执行操作。该类Application应很少使用。这是维持最少量全局状态的最后手段。

一旦您将此代码移入Service, Looper.prepare()Android 就已经为您调用了。

编辑:

当他调用他的 FileManager 类的构造函数时,OP 实际上是试图在 Thread 内创建一个 Handler 。虽然我上面的评论仍然正确,但它与 OP 的问题无关,因为他是 Activity 而不是 Application 的子类。

需要明确的是,实际问题是他在尚未调用 Looper.prepare()(通过 new FileManager())的线程内创建了一个处理程序。正确的解决方法是在主线程上创建处理程序,即在活动或服务回调之一中。

于 2012-07-07T02:56:09.973 回答
1

您可以使用 UI 线程从您的 Thread..like 更新 UI

    yourActivityName.this.runOnUiThread(new Runnable() {
    public void run() {
      //make UI modification here
  }
});
于 2012-07-07T03:29:43.023 回答
1

试试这个:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Thread thread=new Thread(this);
        thread.start();
        }
    public void run() {
            FileManager fM = new FileManager();
            fM.copyFileFromAssetToStorage(); 
            handler.sendEmptyMessage(0);
        }
    private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {

            }
        };

这将要求您对 Activity 实施 Runnable。希望这会对您有所帮助。

于 2012-07-07T04:44:11.663 回答