我正在使用FileObserver监视特定文件夹并将新传入的文件上传到我自己的服务器,解析结果并向用户打印结果通知。代码段如下:
FileInputStream in = new FileInputStream(filePath);
data = readBytes(in);
if (data.length > 1){
//Upload method here
results = G.Upload(data);
if(results.equals("PASS")){
//Toast here
}
if(results.equals("FAIL")){
//Different toast here
}
}
我可以在里面创建一个toast,还是需要将results
变量传递给另一个类并从那里打印Toast通知?非常感谢。
编辑:以上代码段位于FileObserver类中。
答案 0 :(得分:2)
好的,试试这个
首先让我们创建一个名为Observer的接口
public interface ObserverActivity{
public void onFileObserved(int Event, String path);
}
接下来让我们创建FileObserverSubclass
public class MyFileObserver extends FileObserver{
private HashSet<ObserverActivity> registeredObservers;
public MyFileObserver(String path) {
super(path, FileObserver.ALL_EVENTS);
absolutePath = path;
registeredObservers = new HashSet<ObserverActivity>();
}
public void registerObserver(ObserverActivity toRegister){
registeredObservers.add(toRegister);
}
public void unregisterObserver(ObserverActivity toUnregister){
registeredObservers.remove(toUnregister);
}
public void onEvent(int Event, String path){
for(ObserverActivity o: registeredObervers){
o.onFileObserved(Event, path);
}
}
}
最后,在活动中我们想做吐司,我们这样做:
public class MyActivity extends Activity implements ObserverActivity{
MyFileObserver myFileObserver;
protected onCreate(Bundle icicle){
//other setup stuff
myFileObserver = new MyFileObsever("path/to/monitor");
myFileObserver.registerObserver(this);
myFileObserver.startWatching();
}
protected onPause(){
myFileObserver.stopWatching();
myFileObserver.unregisterObserver(this);
}
protected onResume(){
myFileObserver.registerObserver(this);
myFileObserver.startWatching();
}
public void onFileObserved(int Event, String Path){
//do toast in here.
}
你必须停止并取消注册,因为我们可能永远不会回到这个活动,或者它可能会被销毁。如果我们永远不会回到它,我们将继续观察文件并使用所需的资源。那是浪费而且不好。我们需要取消注册,因为如果Activity被销毁,文件观察者在尝试调用onFileObserved方法时会引发空指针异常。
请注意,根据startWatching函数的文档:
此时必须存在受监视的文件或目录,否则不会报告任何事件(即使稍后出现)。如果已开始监控,则此调用无效。
因此,请确保您已开始下载文件。