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

时间:2012-08-29 09:06:22

标签: java android multithreading file blocking

我在一个继承自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;
        }
    }

一旦Thread已经启动,它将从Activity调用。如果我从我的活动中做到这一点:

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

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

2 个答案:

答案 0 :(得分:1)

是的,它会阻止。

什么是重要的不是从中调用该方法的类,它是调用它的线程的run()方法。

很有可能
File logFile = mThread.createFile("/Logs/test.txt");
if(logFile!=null)
//do something
else
//do something else
从您的活动run方法(由android处理)调用

,直接从另一个线程类调用一个方法将不会通过魔法使该线程运行此方法。

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

请参阅this post中的示例,了解如何在线程之间传递消息。总结你的活动线程将从你的其他线程设置一个变量。该线程定期检查此变量并根据它执行操作。这是主要的想法,但对于线程安全和在这些情况下出现的其他问题,有很多内容可以阅读on the web

答案 1 :(得分:0)

您的Activity是一组在UI线程上由Android调用的回调方法。这些回调在Activity的生命周期内执行(如文档中详细描述)。当一个回调正在执行时,没有其他与UI相关的回调。

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

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

我在这里假设(因为问题尚不清楚)对createFile的调用是Activity生命周期回调方法之一(如onCreate)或UI与Activity相关的事件回调(与OnClickListenerButton附加的Activity相似。


如果您不想在创建文件时保留UI线程,则需要从其他“后台”线程执行调用createFile

注意如果您需要从“后台”线程更新UI,则必须确保将调用安排到Android UI API中,以便在UI线程上进行。

这可以使用ThreadHandler对象来完成,但使用AsyncTask通常更方便,因为它提供了一个方便的方法框架,可以在正确的线程上调用用于后台任务和UI更新。