Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写AsyncTask回调中所有索引的对象的Arraylist_Java_Android_Android Asynctask - Fatal编程技术网

Java 重写AsyncTask回调中所有索引的对象的Arraylist

Java 重写AsyncTask回调中所有索引的对象的Arraylist,java,android,android-asynctask,Java,Android,Android Asynctask,阅读这里关于堆栈溢出的几个问题,但找不到有效的解决方案 我的情景=> 在onActivityResult方法中,接收一个列表,该列表被发送到异步任务以进行一些后台工作。执行某些工作后,它会发回一个列表,比如输出。在异步回调中接收到输出后,记录输出列表,并按预期工作 现在,我想把它放在一个数组列表中,比如说addProductModelListTemp,这样我就可以添加更多的对象了。但是,如上述场景所示,在后台添加其他对象时,addProductModelListTemp将使用异步回调中接收到的最

阅读这里关于堆栈溢出的几个问题,但找不到有效的解决方案

我的情景=> 在onActivityResult方法中,接收一个列表,该列表被发送到异步任务以进行一些后台工作。执行某些工作后,它会发回一个列表,比如输出。在异步回调中接收到输出后,记录输出列表,并按预期工作

现在,我想把它放在一个数组列表中,比如说addProductModelListTemp,这样我就可以添加更多的对象了。但是,如上述场景所示,在后台添加其他对象时,addProductModelListTemp将使用异步回调中接收到的最后一个输出列表覆盖其所有索引。下面是我如何更新addProductModelListTemp的代码currentRowIdToInsertImages是在addProductModelListTemp中插入对象的索引,该索引工作正常(为简单起见,此处不包括该索引)

新建CompressFileAsyncTask(新建AsyncResponse(){
@凌驾
公共void processFinish(列表输出){
对于(int i=0;i”+output.get(i));
}
AddProductModel tempProductModel=new AddProductModel(“,”,“,”,dummyList);//虚拟列表是一个空列表,您可以假设它是空的……尝试直接使用**输出设置它**
addProductModelListTemp.add(tempProductModel);
addProductModelListTemp.get(currentRowIdToInsertImages).setImagePathList(输出);
对于(int i=0;i
下面是我用来创建和更新对象的模型类

   public AddProductModel(String size, String color, String quantity, List<Uri> imagePath) {

    this.size = size;
    this.color = color;
    this.quantity = quantity;
    this.imagePath = imagePath;
}

public void setImagePathList(List<Uri> imagePath) {
    if (this.imagePath.isEmpty()) {
        Timber.e("Image Path List not exists, adding");
        this.imagePath = imagePath;
    } else {
        Timber.e("Image Path List exists, appending");
        this.imagePath.addAll(this.imagePath.size(), imagePath);
    }
} // Getter setter not attached for clarity}
public AddProductModel(字符串大小、字符串颜色、字符串数量、列表图像路径){
这个。大小=大小;
这个颜色=颜色;
这个。数量=数量;
this.imagePath=imagePath;
}
public void setImagePathList(列表imagePath){
if(this.imagePath.isEmpty()){
Timber.e(“图像路径列表不存在,添加”);
this.imagePath=imagePath;
}否则{
Timber.e(“存在图像路径列表,请追加”);
this.imagePath.addAll(this.imagePath.size(),imagePath);
}
}//为清晰起见,未连接Getter setter}
AsyncTask类是

class CompressFileAsyncTask extends AsyncTask<List<Uri>, Void, List<Uri>> {
    public AsyncResponse asyncResponse = null;

    public CompressFileAsyncTask(AsyncResponse asyncResponse) {
        this.asyncResponse = asyncResponse;
    }

    @Override
    protected List<Uri> doInBackground(List<Uri>... imageUriList) {
        List<Uri> fileList = imageUriList[0];

        for (int i = 0; i < fileList.size(); i++) {
            filesAdded.add(Uri.parse(compressImage(String.valueOf(fileList.get(i)))));
        }
        return filesAdded;
    }


    @Override
    protected void onPostExecute(List<Uri> uriArrayList) {
        asyncResponse.processFinish(uriArrayList);
    }
}
class CompressFileAsyncTask扩展了AsyncTask{
public AsyncResponse AsyncResponse=null;
公共压缩文件异步任务(异步响应异步响应){
this.asyncResponse=asyncResponse;
}
@凌驾
受保护列表doInBackground(列表…imageUriList){
List fileList=imageUriList[0];
对于(int i=0;i
以及接口本身

public interface AsyncResponse {
public void processFinish(List<Uri> output);
公共接口异步响应{
公共void processFinish(列表输出);

}问题在于,您正在修改相同的列表对象,并将其存储在
addProductModelListTemp
的每个索引中。您需要将
filesAdded
设置为局部变量

@Override
    protected List<Uri> doInBackground(List<Uri>... imageUriList) {
        List<Uri> fileList = imageUriList[0];
        List<Uri> filesAdded = new ArrayList<>();
        for (int i = 0; i < fileList.size(); i++) {
            filesAdded.add(Uri.parse(compressImage(String.valueOf(fileList.get(i)))));
        }
        return filesAdded;
    }
@覆盖
受保护列表doInBackground(列表…imageUriList){
List fileList=imageUriList[0];
List filesAdded=new ArrayList();
对于(int i=0;i
能否请您共享异步任务的预期输入和输出。并阐明“addProductModelListTemp被覆盖其所有索引”的含义。“addProductModelListTemp”是AddProductModel的arraylist。“imageUriList”是我在onActivityResult方法中接收的意向数据。“输出”是AsyncTask完成并触发回调后我接收的列表这是我在onActivityResult方法中接收的ImageURIList,当我选择三个图像ImageURIList索引0时content://media/external/images/media/140871 图像列表索引1content://media/external/images/media/139181 图像列表索引2content://media/external/images/media/139180I 只需以异步方式发送它们,并获得三个压缩图像。我创建了AddProductModel的一个对象并将这些图像保存在“imagePath”列表中,然后我将该对象保存在“addProductModelListTemp”列表中,以便以后使用。现在我在“addProductModelListTemp”的索引0上有三个图像。正确的?现在,我再次打电话给画廊,用上面使用的相同方法,挑选了5幅我试图保存在“addProductModelListTemp”第二个索引中的图像。现在,如果我记录我的“addProductModelListTemp”数组,它包含两个索引,但在这两个索引上,“imagePath”列表包含5个相同的图像。我希望我现在可以从“addProductModelListTemp”检索两个对象。而且
@Override
    protected List<Uri> doInBackground(List<Uri>... imageUriList) {
        List<Uri> fileList = imageUriList[0];
        List<Uri> filesAdded = new ArrayList<>();
        for (int i = 0; i < fileList.size(); i++) {
            filesAdded.add(Uri.parse(compressImage(String.valueOf(fileList.get(i)))));
        }
        return filesAdded;
    }