2015-01-31 2 views
0

Я начинаю с Android и Java, и мой английский не очень хорош (извините). Я делаю приложение, которое сравнивает 2 снимка, принимаемых камерой, и возвращает значение поплавка = отношение идентичных пикселей на 2 изображениях.Android - Получение возвращаемого значения потока

public static float comparePic(String img_1, String img_2){ 
    Bitmap bitmap1 = BitmapFactory.decodeFile(img_1); 
    Bitmap bitmap2 = BitmapFactory.decodeFile(img_2); 
    int equ = 0; 
    //get one height and one width because we assume that pictures have always same sizes 
    int h = bitmap1.getHeight(); 
    int w = bitmap1.getWidth(); 
    for(int y=0;y<h;y++){ 
     for (int x=0;x<w;x++){ 
      int pixel1 = bitmap1.getPixel(x,y); 
      int pixel2 = bitmap2.getPixel(x,y); 
      //alpha doesn't matter, they're jpg 
      int redValue1 = Color.red(pixel1); 
      int redValue2 = Color.red(pixel2); 
      int greenValue1 = Color.green(pixel1); 
      int greenValue2 = Color.green(pixel2); 
      int blueValue1 = Color.blue(pixel1); 
      int blueValue2 = Color.blue(pixel2); 
      if (redValue1==redValue2 && greenValue1==greenValue2 && blueValue1==blueValue2){ 
       equ++; 
      } 
     } 
    } 
    return (float)equ/(h*w); 
} 

Когда я исполню его, у меня есть такое сообщение: «Я/Хореограф: Пропущено 730 кадров Приложение может делать слишком много работы на своем главном потоке.» Итак, я попытался сделать это с помощью потока, но я всегда терпеть неудачу, потому что не знаю, как вернуть значение. Futhermore, пропуская рамки, я думаю, это неправильное соотношение. Я знаю, что это асинхронная работа, так что я могу сделать? Спасибо!

+1

Не могли бы вы показать нам, как вы попытались решить вашу проблему с помощью потока? – DennisW

ответ

0

Вы можете просто добавить общедоступный метод (setter-) в ваш основной класс (или где вам нужно значение). Когда ваш асинхронный поток выполняется, вызовите метод с параметром equ.

Вы, очевидно, должны заботиться о безопасности потоков, поэтому подумайте о том, чтобы сделать метод синхронизированным.

+0

Хорошо, я попробую это. Спасибо за вашу помощь ! – Siliciium

+0

Помните, что вы не можете получить доступ к виду из потока, отличного от основного потока. –

0

Попробуйте указать AsyncTask. Это класс, специально подготовленный для фоновой обработки. У этого есть некоторые недостатки (это нехорошая идея, чтобы объединиться с AsyncTask), но для некоторых вещей сравнения изображений это отличный инструмент.

0

Определите Asynctask с интерфейсом и реализуйте этот интерфейс в основной деятельности.

Таким образом вы можете уведомить об этом действии хоста, которое завершила фоновая асинхронизация.

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