1

我在继承自 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

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

4

2 回答 2

1

是的,它会阻塞。

重要的不是调用方法的类,而是调用它run()的线程的方法。有很大概率是

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

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

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

有关如何在线程之间传递消息,请参阅本文中的示例总而言之,您的活动线程将从您的其他线程设置一个变量。该线程定期检查此变量并根据它执行操作。这是主要思想,但在网上有很多关于线程安全和这些情况下出现的其他问题的信息。

于 2012-08-29T09:40:27.953 回答
0

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

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

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

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


如果您不想在创建文件时阻止 UI 线程,那么您将需要createFile从不同的“后台”线程执行调用。

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

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

于 2012-08-29T18:04:03.250 回答