我在一个继承自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
在创建文件之前它会阻塞吗?
答案 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
相关的事件回调(与OnClickListener
上Button
附加的Activity
相似。
如果您不想在创建文件时保留UI线程,则需要从其他“后台”线程执行调用createFile
。
注意如果您需要从“后台”线程更新UI,则必须确保将调用安排到Android UI API中,以便在UI线程上进行。
这可以使用Thread
和Handler
对象来完成,但使用AsyncTask
通常更方便,因为它提供了一个方便的方法框架,可以在正确的线程上调用用于后台任务和UI更新。