Java 动态更新异步任务

Java 动态更新异步任务,java,android,Java,Android,问题: 我有一个带有公共ArrayList的AsyncTask,我想知道是否可以在不停止任务的情况下动态更新此ArrayList 问题是,我的任务加载有关其内部数组中元素的信息,同时我的活动可以加载更多元素,因此我想知道是否可以将这些新元素推入任务的数组,而不是创建新任务 解决方案: 我的任务: 要添加新元素,请执行以下操作: 要完成任务,您只需: 答案是否定的,而且非常仔细。否-如果没有额外的工作,您无法使用列表来完成此操作。您需要使用信号量或使用同步列表来保护对数据的访问。否则,您可能会同时

问题: 我有一个带有公共ArrayList的AsyncTask,我想知道是否可以在不停止任务的情况下动态更新此ArrayList

问题是,我的任务加载有关其内部数组中元素的信息,同时我的活动可以加载更多元素,因此我想知道是否可以将这些新元素推入任务的数组,而不是创建新任务

解决方案

我的任务:

要添加新元素,请执行以下操作:

要完成任务,您只需:


答案是否定的,而且非常仔细。否-如果没有额外的工作,您无法使用列表来完成此操作。您需要使用信号量或使用同步列表来保护对数据的访问。否则,您可能会同时访问列表,导致不正确的部分状态。这是不好的,尤其是当两者同时更新列表时,可能会导致内存访问错误甚至崩溃


如果使用同步列表或信号量,则可以访问它,但需要仔细编写算法,以避免在中途删除/添加项时出现问题。但是回答如何做到这一点是非常广泛的,你需要给我们一个更具体的算法来做到这一点。

请详细解释你想要什么,并显示你的代码。你不是要等待任务完成,然后检查arraylist是否已更新吗?如果否,完美,如果是,重新启动任务?我不认为你可以更新后台线程上使用的数据,我也不认为这是个好主意。让我们看看,我有一个任务可以加载他数组中元素的信息,我的主类可以同时加载更多的元素,所以要做的是将这些新元素添加到任务数组中,这样它就可以继续加载信息。谢谢你,我会尝试用这个想法编写一些代码,并尽早共享;)
public class TaskGetMatchesDetails extends AsyncTask<Void, MatchDetails, Void> {

private FragmentHistory fragmentHistory;

//Dynamic Data, Array where we have to add and remove elements.
private ArrayList<Match> matchesArrayList;

//Constructor
public TaskGetMatchesDetails(FragmentHistory f) {
    this.fragmentHistory = f;
    this.matchesArrayList = new ArrayList<>();
}

//SYNCHRONIZED METHODS

public synchronized void addMatch(Match match) {
    if (this.matchesArrayList != null) {
        this.matchesArrayList.add(match);
        Log.d("TASK DETAILS", "ADDED MATCH: " + match.getMatchId());
    }
}

public synchronized Match getFirsMatchFromArrayList() {
    if (matchesArrayList.size() > 0) {
        return matchesArrayList.get(0);
    }
    return null;
}

public synchronized void removeMatchFromArrayList(Match match) {
    if (this.matchesArrayList != null) {
        this.matchesArrayList.remove(match);
        Log.d("TASK DETAILS", "REMOVED MATCH: " + match.getMatchId());
    }
}

@Override
protected Void doInBackground(Void... params) {
    Match match;
    MatchDetails matchDetails;
    while (!isCancelled()) {

        //If we have not work to do continue
        if (matchesArrayList.size() <= 0) {
            continue;
        }

        //Get the work for this iteration
        Match m = getFirsMatchFromArrayList();

        //If we have already calculated this data we just jump to other cycle
        if (fragmentHistory.getMatchDetails(m.getMatchId()) != null) {
            removeMatchFromArrayList(m);
            continue;
        }

        matchDetails = new MatchDetails();

        //TODO: Here we have to proccess the data.

        publishProgress(matchDetails);
        removeMatchFromArrayList(m);

    }
    return null;
}

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    fragmentHistory.setTaskGetMatchesDetails(null);
    cancel(true);
}

@Override
protected void onProgressUpdate(MatchDetails... matches) {
    super.onProgressUpdate(matches);
    //We save the data calculated in this fragment
    fragmentHistory.addMatchDetails(matches[0]);
}

@Override
protected void onCancelled() {
    super.onCancelled();
    }
}
taskGetMatchesDetails = new TaskGetMatchesDetails(this);
taskGetMatchesDetails.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
taskGetMatchesDetails.addMatch(m);
taskGetMatchesDetails.cancel(true);