Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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 异步变量和动态变量的类型不同_Java_Android_Opencv - Fatal编程技术网

Java 异步变量和动态变量的类型不同

Java 异步变量和动态变量的类型不同,java,android,opencv,Java,Android,Opencv,我有一个叫做grayVal的变量,它告诉我一个像素的灰度值,我的相机指向的是什么。显然,当我移动相机时,这个数字在不断变化。我的问题是,当我在一个异步循环中传递grayVal以测试grayVal通过阈值所需的时间时,无论我将相机指向何处,该数字都不会改变。我被告知grayVal(在onCameraFrame中)和grayVal(在doInBackground中)不是同一种类型。我把它们改成了双打,但结果是一样的 在UI线程中 volatile double [] grayVal; @Over

我有一个叫做grayVal的变量,它告诉我一个像素的灰度值,我的相机指向的是什么。显然,当我移动相机时,这个数字在不断变化。我的问题是,当我在一个异步循环中传递grayVal以测试grayVal通过阈值所需的时间时,无论我将相机指向何处,该数字都不会改变。我被告知grayVal(在onCameraFrame中)和grayVal(在doInBackground中)不是同一种类型。我把它们改成了双打,但结果是一样的

在UI线程中

volatile double [] grayVal;


@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    grayMat = inputFrame.gray();
    double [] grayPixel = grayMat.get(100,100);
    grayVal = grayPixel;
    Log.i("Mat Value", String.valueOf(grayVal[0]));
    return grayMat;
}
异步任务

public class startTestAsync extends AsyncTask<Double, Void, Void> {       
int testAmount;
@Override
protected Void doInBackground(Double...grayVal) {
    for (testAmount = 0; testAmount < 5000; testAmount++) {
        Log.i("Mat Value Async", String.valueOf(grayVal[0]));
    }
    return null;
}
protected void onPostExecute(Long result) {
}
}

请同时尝试所有这些更改:

volatile double grayValGlobal;

public类startTestAsync扩展异步任务{
double[]timeArray=new double[500];//设置数组
双重评级=0;
双滞后时间;
双滞后时间;
双滞后结果;
int测试量;
int-cnt;
@凌驾
受保护的空doInBackground(双…灰色){
用于(testAmount=0;testAmount<5000;testAmount++){
Log.i(“Mat-Value-Async”,String.valueOf(grayValGlobal));
lagStartTime=System.nanoTime();//启动lagTimer启动
}
}
返回null;
}
受保护的void onPostExecute(长结果){
//做点什么
}
}
并公布结果

编辑:
volatile双灰色全局在其放置位置(类内部)不是真正全局的。所以我猜(不是java专业版):
doInBackground
某处得到了grayVal(全局)作为输入参数。但是该参数不是通过引用传递的,因此在整个测试过程中只使用一个固定值。

为什么这样访问
grayVal
一次:
grayVal=grayPixel
(像一个原语)这样:
grayVal[0]
(像一个数组)?如果将其更改为
grayVal[0]=grayMat.get(100100),会发生什么情况
您可以再次将完整代码链接到pastebin吗?
受保护的Void doInBackground(Double…grayVal)
您的方法参数与全局变量同名。更改其中一个名称,使全局变量具有唯一的名称!。不要将方法参数命名为全局变量!这是我所有的代码,我将
Double…grayVal
更改为
Double…grayValAsync
,结果仍然相同请测试我的答案。另外,
doInBackground
是如何调用的/在哪里调用的,您给它指定了什么参数?您可能必须将该定义更改为
doInBackground(volatile Double…grayValAsync)
,否则编译器将看不到该参数的任何更改,因为它在方法本身中没有更改…在
grayValGlobal=grayMat.get(100100)上
android studio表示“不兼容的类型,必需的双精度,找到的双精度[]”无法在
Log.i(“Mat-Value-Async”,String.valueOf(grayValGlobal))中解析grayValGlobal
在Asyncah中,该变量不是全局变量,因为它位于类testActivity中。。。
doInBackground
从何处调用?在
startTestAsync.java
中,在链接的代码中,我只看到定义,但看不到它在何处调用以及它得到的输入参数。
volatile double grayValGlobal;
@Override
                    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
                        grayMat = inputFrame.gray();
                        double [] grayPixel = grayMat.get(100,100);
                        grayValGlobal = grayPixel[0];
                        Log.i("Mat Value", String.valueOf(grayValGlobal ));
                        return grayMat;
                    }
public class startTestAsync extends AsyncTask<Double, Void, Void> {
        double[] timeArray = new double[500]; // set array
        double rating = 0;
        double lagStartTime;
        double lagEndTime;
        double lagTimeResult;
        int testAmount;
        int cnt;
        @Override
        protected Void doInBackground(Double...grayVal) {

            for (testAmount = 0; testAmount < 5000; testAmount++) {

                Log.i("Mat Value Async", String.valueOf(grayValGlobal));
                lagStartTime = System.nanoTime(); //start lagTimer start
                    }
            }
            return null;
        }
        protected void onPostExecute(Long result) {
            //Do something
        }

    }