【问题标题】:Android, call interface method from anonymous thread in another classAndroid,从另一个类中的匿名线程调用接口方法
【发布时间】:2011-04-06 07:49:30
【问题描述】:

我的 Activity 实现了一个接口 IProcess。

我有一个名为 Scaler 的类,其中有一个名为 doProcess() 的静态方法。

doProcess 包含一个匿名线程,该线程调用一个处理方法,在运行时更新其进度。

当流程完成后,我想在实现 IProcess 的 My Activity 上调用接口方法来显示对话框,但是,在对话框应该显示的位置出现异常,提示:

04-06 08:43:54.048: ERROR/AndroidRuntime(6832): java.lang.RuntimeException: 
Can't create handler inside thread that has not called Looper.prepare()

我做错了什么,请问在我的主要活动中显示对话框的替代方法(如果这是错误的)是什么?

【问题讨论】:

    标签: android multithreading android-activity dialog


    【解决方案1】:

    为了从另一个线程通知 UI 线程,您应该使用 Handlers

    【讨论】:

    • 您能详细说明一下吗?我尝试将我的接口调用放在一个可运行对象中并使用处理程序发布它,但可运行对象没有对接口的引用。
    【解决方案2】:

    如果这是一个“一次性”背景任务,您可以使用AsyncTaskdoInBackground() 中进行处理,然后从那里调用publishProgress()。然后系统会调用onProgressUpdate(),您可以在其中操作 UI 元素。

    你可以在这里找到一个例子:https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/TweetListActivity.java#L328

    PublishProgess 是例如在第 391 和 403 行调用,onProgressUpdate 从第 451 行开始。

    另请参阅documentation for AsyncTask

    【讨论】:

    • 这是一个一次性的过程,它只需要执行一次......永远。你有我如何使用它的例子吗?
    • 谢谢,读起来很有趣,但我选择不在这里使用这种方法,因为我在从 ASyncTask 访问应用程序资产时遇到问题。
    猜你喜欢
    • 1970-01-01
    • 2015-11-06
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    相关资源
    最近更新 更多