代码之家  ›  专栏  ›  技术社区  ›  Moises Jimenez

如果返回值取决于阻塞操作的结果,方法会被阻塞吗?

  •  1
  • Moises Jimenez  · 技术社区  · 13 年前

    我在继承自Thread类的类中编写了以下方法:

    protected File createFile(String fileName){
            try {
                File file = new File(fileName);
                if(!file.exists())
                    file.createNewFile();
                else{
                    file.delete();
                    file.createNewFile();
                }
                file.mkdirs();
                return file;
            }catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    

    一旦线程已经启动,就会从“活动”调用它。如果我在“活动”中执行此操作:

    File logFile = mThread.createFile("/Logs/test.txt");
    if(logFile!=null)
    //do something
    else
    //do something else
    

    在创建文件之前它会被阻止吗?

    2 回复  |  直到 13 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    是的,它会阻塞。

    重要的不是从中调用方法的类,而是 run() 调用它的线程的方法。很有可能

    File logFile = mThread.createFile("/Logs/test.txt");
    if(logFile!=null)
    //do something
    else
    //do something else
    

    从您的活动中调用 run 方法(由android处理),并且直接从另一个线程类调用方法将不会使该线程运行该方法。

    为了确保您不会用此阻止您的活动 createFile 方法应该使用消息传递机制,以便 创建文件 在中调用 运行() 非活动线程的方法。

    参见中的示例 this post 了解如何在线程之间传递消息。总之,您的活动线程将从另一个线程设置一个变量。这个线程定期检查这个变量并根据它执行操作 on the web 关于螺纹安全以及在这些情况下出现的其他问题。

        2
  •  0
  •   Mike Tunnicliffe    13 年前

    你的 Activity 是一组回调方法,由Android在UI线程上调用。这些回调在 活动 (详见文档)。当一个回调正在执行时,不会有其他与UI相关的回调。

    如果任何一个回调都需要很长时间,那么UI就会停止响应(您通常会看到这被称为“UI被阻止”)。

    为了回答实际问题:是的,UI线程在等待回调完成时将停止处理其他事件,包括对 createFile 方法

    我在此假设(由于问题不清楚) 创建文件 在其中一个 活动 生命周期回调方法(如 onCreate )或与 活动 (就像 OnClickListener 附加到 Button 活动 )。


    如果您不想在创建文件时挂起UI线程,则需要执行调用 创建文件 来自不同的“背景”线程。

    笔记 如果您需要从“后台”线程更新UI,则必须确保将对Android UI API的调用安排回UI线程。

    这可以使用 Thread Handler 对象,但使用 AsyncTask 因为它提供了一个方便的方法框架,这些方法在后台任务和UI更新的正确线程上被调用。