Android - 获取线程的返回值

时间:2015-01-31 16:52:08

标签: java android multithreading

我从Android和Java开始,我的英语不是很好(对不起)。 我正在做一个应用程序比较相机拍摄的2张照片并返回浮动值= 2张照片中相同像素的比例。

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帧!应用程序可能在其主线程上做了太多工作。” 所以我尝试用线程来做,但我总是失败因为我不知道如何返回值。 此外,通过跳过帧我猜,比率是不正确的。 我知道这是一项异常的工作,所以我该怎么办? 谢谢!

3 个答案:

答案 0 :(得分:0)

您可以在主类中(或者您需要值的任何地方)添加公共(setter-)方法。 异步线程完成后,调用equ作为参数的方法。

您显然需要关心线程安全性,因此请考虑使该方法同步。

答案 1 :(得分:0)

你应该尝试AsyncTask。这是专门为后台处理准备的课程。它有一些缺点(使用AsyncTask进行网络连接并不是一个好主意),但是对于一些图片比较来说它是一个很棒的工具。

答案 2 :(得分:0)

使用接口定义Asynctask并在主Activity中实现该接口。

通过这种方式,您可以通知主机活动后台asynctask已完成。