Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 何时使用哪种方式访问UI线程?_Android_Multithreading_User Interface - Fatal编程技术网

Android 何时使用哪种方式访问UI线程?

Android 何时使用哪种方式访问UI线程?,android,multithreading,user-interface,Android,Multithreading,User Interface,根据文档,应该使用三个选项中的一个从不同的线程访问UI线程。 这些是选项: Activity.runOnUiThread(可运行) View.post(可运行) View.postDelayed(可运行,长) 我什么时候应该用哪个?它们似乎都向UI线程的消息队列添加了一个Runnable 我假设postDelayed只有在您想为以后安排Runnable时才真正有用,他们只是提到它,因为它也在UI线程上运行Runnable 对于额外的混乱,还有异步任务。我现在应该什么时候使用它?我总是选择runO

根据文档,应该使用三个选项中的一个从不同的线程访问UI线程。 这些是选项:

  • Activity.runOnUiThread(可运行)
  • View.post(可运行)
  • View.postDelayed(可运行,长)
  • 我什么时候应该用哪个?它们似乎都向UI线程的消息队列添加了一个Runnable

    我假设postDelayed只有在您想为以后安排Runnable时才真正有用,他们只是提到它,因为它也在UI线程上运行Runnable


    对于额外的混乱,还有异步任务。我现在应该什么时候使用它?

    我总是选择runOnUiThread,我认为这是在同一UI线程上运行某些东西的最佳方式。
    异步任务很棘手,这是一个好主意,但如果您想使用新的东西,请使用加载程序或IntentService。

    RunnuIthread视图。post完全相同,它们都向活动的处理程序发送可运行对象。所以随便你用吧

    关于异步任务,它不用于在UI线程上运行。但在异步任务完成工作后,它会在UI线程上调用名为
    onPostExecute
    的方法


    关于这个主题有一个非常好的教程

    忘记
    AsyncTask
    ,它不是在UI线程中运行代码,而是在后台线程中运行代码,从UI线程启动
    AsyncTask


    关于其他选项,请随意选择其中任何一个。如果您正在处理
    视图
    对象,则很可能您已经在UI线程上。因此,您最好从另一个线程中引用
    活动
    上下文,并调用runOnUiThread

    我建议您使用,它们被设计用于在其他线程()中进行艰苦工作,然后与UI线程同步以推送工作结果(),当然,您可以使用工作进度()定期更新UI


    如果您想在比Honeycom更大的Android版本上同时运行多个AsyncTask,您可以使用我的small lubrary:

    如果您需要一种返回UI线程的机制,该机制在任何地方都可用,而不需要上下文,您可以使用以下方法:

    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(Runnable);
    

    AsyncTasks是最具逻辑性的类之一,因为它们具有线性执行模式。执行如下:
    onPreExecute()
    (UI线程)->
    doInBackground()
    (非UI线程)->此方法完成后,将结果传递给
    onPostExecute()
    (UI线程)。简单!