【问题标题】:How to perform the same operation on several elements in array in doInBackground()如何在doInBackground()中对数组中的多个元素执行相同的操作
【发布时间】:2015-11-24 06:29:23
【问题描述】:

解决方案:我在 doInBackground() 方法中使用了“for each”循环,如下所示:

for(MyImage img:params){
    //this time though for each element I saved the result in a ArrayList<> 
    //and returned the ArrayList<> as the result
}

玩了几个小时,所以我想我只是累了。问题解决了。很抱歉浪费您的时间,谢谢!

我很难对 AsyncTask 的 doInBackground() 中传递的每个元素执行相同的操作。我只得到一个操作和结果。该数组包含 10 个元素。

private class ImageComparator extends AsyncTask<MyImage, Integer, Double>{
    private SQLiteImageDatabase database;

    @Override
    protected void onPreExecute(){
        //prepare database
        database = DetailActivity.this.database;
    }

    @Override
    protected Double doInBackground(MyImage... params) {

        Log.d("doInBack", "doInBack reached");
        //add as record and calc image features
        params[0].createPixelArrayFromBitmap();
        params[0].getRGBFromPixels(params[0].getPixels());
        params[0].getHistogram().calcOccurrenceOfValues(params[0].getrValues(), Histogram.colorComponent.RED);
        params[0].getHistogram().calcOccurrenceOfValues(params[0].getgValues(), Histogram.colorComponent.GREEN);
        params[0].getHistogram().calcOccurrenceOfValues(params[0].getbValues(), Histogram.colorComponent.BLUE);

        params[0].getHistogram().calcMeanValueFromOccurrences(params[0].getHistogram().getrOccurrence(), Histogram.colorComponent.RED);
        params[0].getHistogram().calcMeanValueFromOccurrences(params[0].getHistogram().getgOccurrence(), Histogram.colorComponent.GREEN);
        params[0].getHistogram().calcMeanValueFromOccurrences(params[0].getHistogram().getbOccurrence(), Histogram.colorComponent.BLUE);


        //compare images
        double result = imageHandler.calcEuclideanDistanceBetweenImages(imageHandler.getCurrentImage(), params[0]);

        return result;
    }
    @Override
    protected void onPostExecute (Double result){
        Log.d("compare","distance after comparison: "+result);
    }

当我执行我的 AsyncTask 时,我像这样传递一个数组 MyImage[]

ImageComparator comparator = new ImageComparator();
comparator.execute(imageHandler.getImages().toArray(new MyImage[imageHandler.getImages().size()]));

这是否对传递的 MyImage[] 数组中的每个元素执行相同的操作?我尝试在 doInBackground 方法中编写一个 for 循环,但这不起作用。我需要对每张图像进行的每次计算的结果。

我尝试的 for 循环如下所示:

for(MyImage img:params){
    //do stuff
}

我应该将结果保存在列表中并将列表作为结果返回吗?

【问题讨论】:

  • doInBackground(MyImage... params) 表示您可以在for (MyImage image : params) {... 循环中使用params
  • 但我最后还是只得到一个结果。
  • 如果你不熟悉... 语法然后在某个类中创建一个方法void foo(String... parameters) 并尝试调用它,在该方法中使用上面的循环输出参数,这样做你会学习如何调用foo方法
  • 您应该发布您的解决方案作为您自己问题的答案,然后接受它。这样一来,正确答案就一目了然了。在该答案中,您应该显示 AsyncTask 的完整代码,并实现了 foreach() 循环。这样一来,其他发现此问题的人就会更有帮助。

标签: android android-asynctask


【解决方案1】:

使用 for 循环,如下所示。

for(int i = 0;i <params.length; i++ ){

        params[0].createPixelArrayFromBitmap();
        params[0].getRGBFromPixels(params[0].getPixels());
        params[0].getHistogram().calcOccurrenceOfValues(params[0].getrValues(), Histogram.colorComponent.RED);
        params[0].getHistogram().calcOccurrenceOfValues(params[0].getgValues(), Histogram.colorComponent.GREEN);
        params[0].getHistogram().calcOccurrenceOfValues(params[0].getbValues(), Histogram.colorComponent.BLUE);

        params[0].getHistogram().calcMeanValueFromOccurrences(params[0].getHistogram().getrOccurrence(), Histogram.colorComponent.RED);
        params[0].getHistogram().calcMeanValueFromOccurrences(params[0].getHistogram().getgOccurrence(), Histogram.colorComponent.GREEN);
        params[0].getHistogram().calcMeanValueFromOccurrences(params[0].getHistogram().getbOccurrence(), Histogram.colorComponent.BLUE);


}

并将每个参数 [0] 替换为参数 [i]

【讨论】:

    【解决方案2】:

    解决方案是在 doInBackground() 方法中创建一个 for 循环,并为 for 循环中的每个项目将计算结果保存在 ArrayList 中,最后返回 ArrayList 作为结果。然后在 onPostExecute() 方法中根据自己的喜好遍历 ArrayList。

    private class ImageComparator extends AsyncTask<MyImage, Integer, ArrayList<Double>>{
        private SQLiteImageDatabase database;
        private ArrayList<Double> results;
        @Override
        protected void onPreExecute(){
            //prepare database
            database = DetailActivity.this.database;
            results = new ArrayList<>();
        }
    
        @Override
        protected ArrayList<Double> doInBackground(MyImage... params) {
    
            Log.d("doInBack", "doInBack reached");
            for(MyImage img:params){
                //compare images
                double result = imageHandler.calcEuclideanDistanceBetweenImages(imageHandler.getCurrentImage(), img);
                results.add(result);
            }
    
    
            return results;
        }
        @Override
        protected void onPostExecute (ArrayList<Double> result){
            for(double d:result){
                Log.d("compare","distance after comparison: "+d);
            }
    
        }
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 2012-10-11
      • 2021-12-24
      相关资源
      最近更新 更多