AsyncTasks中的同步方法

时间:2018-06-14 19:37:44

标签: android android-asynctask synchronized

我的应用程序是从传感器收集数据,我让用户手动保存标签。每当用户触摸一个按钮来保存标签时,我运行一个AsyncTask并在doInBackground方法中,我正在调用一个同步方法,其唯一目的是将信息保存在文件中。该方法是帮助程序库的一部分,因此我通过静态方法访问它,因此它是一个同步静态方法。我需要按照输入的顺序保存标签。但是,我注意到有时标签以不同的顺序保存,这告诉我同步方法可能没有按预期工作

  1. AsyncTasks中的同步方法是否有任何限制?
  2. 有没有更好的方法来实现这一目标?我的意思是,继续将数据保存在后台线程中但确保如果我们有多个,我按照它们到达的顺序执行它们?
  3. 代码看起来有点像这样:

    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) {
        }
    }
    

1 个答案:

答案 0 :(得分:1)

  1. AsyncTasks
  2. 中的同步方法有任何 no 限制

    Btw synchronized不是关于顺序的,它只关于阻塞部分代码只能在一个时间内完成。所以可能存在这样的情况:

    任务1开始

    任务2开始

    任务2编写并完成

    任务1编写并完成

    1. 您可以使用Thread代替AsyncTask。然后仅使用一个帖子使用ThreadPoolExecutor或使用thread.join()
    2. 但最好使用RxJava2Kotlin Coroutines来处理此类事情