2015-11-23 1 views
0

РЕШЕНИЕ: Я использовал метод «для каждого» петли в doInBackground(), как это:Как выполнить ту же самую операцию на нескольких элементов в массиве в doInBackground()

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

Been у него пару часов, поэтому, я думаю, я просто устал. Задача решена. Извините за потраченное время и спасибо!

Мне очень тяжело пытаться выполнить одну и ту же операцию над каждым элементом, переданным в doInBackground() моей AsyncTask. Я получаю только одну операцию и результат. Массив содержит 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 [] массив? Я попытался написать цикл for внутри метода doInBackground, но это не сработало. Мне нужен результат от каждого расчета, сделанного на каждом изображении.

для цикла я попытался выглядел так:

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

Должен ли я сохранить результат в виде списка и возвращает список как результат?

+0

'doInBackground (MyImage ... PARAMS)' означает, что вы можете использовать 'params' в' для (MyImage изображения: Params) {... 'петля – pskink

+0

Но я до сих пор только один результат в конец. – knerlington

+0

, если вы не знакомы с синтаксисом '...', тогда создайте метод 'void foo (String ... parameters)' в каком-то классе и попытайтесь вызвать его, внутри этого метода используйте вышеуказанный цикл для вывода параметров, делая что вы узнаете, как назвать метод 'foo' – pskink

ответ

0

Используйте для петли, как показано ниже.

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); 


} 

и заменить каждый PARAMS [0] с Params [I]

0

Решение было создать цикл внутри метода doInBackground() и для каждого элемента в течение цикла сохранить результат вычислений в 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); 
     } 

    } 


} 
Смежные вопросы