我的应用程序是从传感器收集数据,我让用户手动保存标签。每当用户触摸一个按钮来保存标签时,我运行一个AsyncTask并在doInBackground方法中,我正在调用一个同步方法,其唯一目的是将信息保存在文件中。该方法是帮助程序库的一部分,因此我通过静态方法访问它,因此它是一个同步静态方法。我需要按照输入的顺序保存标签。但是,我注意到有时标签以不同的顺序保存,这告诉我同步方法可能没有按预期工作
代码看起来有点像这样:
public class FileUtil {
public static synchronized void saveActivityDataToFile() throws IOException{
//Saving file code
}
}
//This asynctask is called everytime the user touches the button
private class SaveDataInBackground extends AsyncTask<String, Integer, Void> {
public SaveDataInBackground(){
}
protected Void doInBackground(String... lists) {
try {
//I expect this to run on its own thread but synchronously if this asynctask is called multiple times withing a short interval of time
FileUtil.saveActivityDataToFile();
}catch (IOException e){
Log.e(TAG,"Error while saving activity: " + e.getMessage());
}
return null;
}
protected void onPostExecute(Void v) {
}
}
答案 0 :(得分:1)
AsyncTasks
Btw synchronized不是关于顺序的,它只关于阻塞部分代码只能在一个时间内完成。所以可能存在这样的情况:
任务1开始
任务2开始
任务2编写并完成
任务1编写并完成
Thread
代替AsyncTask
。然后仅使用一个帖子使用ThreadPoolExecutor
或使用thread.join()
但最好使用RxJava2
或Kotlin Coroutines
来处理此类事情