Java Android在延迟结束前获取公共位图函数返回

Java Android在延迟结束前获取公共位图函数返回,java,android,delay,delayed-execution,timedelay,Java,Android,Delay,Delayed Execution,Timedelay,因此,我有一个公共静态位图,里面有2000密耳的延迟。我的问题是,在执行延迟的代码之前,我得到了return 让您了解我的职能结构: public static Bitmap getBitmapFromWebview(WebView webView){ *******************some code here Handler handler = new Handler(); handler.postDelayed(new Runnable() {

因此,我有一个
公共静态位图
,里面有2000密耳的延迟。我的问题是,在执行延迟的代码之前,我得到了
return

让您了解我的职能结构:

public static Bitmap getBitmapFromWebview(WebView webView){
    *******************some code here
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            ********************declaring bm bitmap
            Log.i("DelayD", "Delay");
        }
    }, 2000);


    Log.i("DelayD", "Return");
    return bm;
}
我已经设置了两条调试消息-在延迟部分内,一条在
返回之前

以下是我在日志中得到的信息:

08-11 20:45:13.520 I/DelayD: Return
08-11 20:45:16.173 I/DelayD: Delay
以及一条错误消息,我不确定这些消息是否相关:

08-11 20:44:45.170 E/Sensors: new setDelay handle(0),ns(66667000)m, error(0), index(2)
08-11 20:44:48.082 E/Sensors: new setDelay handle(0),ns(66667000)m, error(0), index(2)
我的问题是,在执行被延迟的代码之前,我得到了return

正如中所述,
postDelayed()
不会延迟调用它的方法。它将
Runnable
调度为在指定的延迟期后运行<代码>getBitmapFromWebview()
有望在微秒后返回

我的问题是,在执行被延迟的代码之前,我得到了return


正如中所述,
postDelayed()
不会延迟调用它的方法。它将
Runnable
调度为在指定的延迟期后运行
getBitmapFromWebview()
可能会在微秒后返回。

在处理程序上调用函数
handler.postDelayed
时,它将获取您创建的
Runnable
实例并将其存储在变量中。结束后,执行函数中的下一行

简单地说,在2000ms之后的某个时间,调用
Runnable
中的函数
run

因此,您看到的顺序是非常可预测的,您看到的结果也是如此

要掌握的核心概念是,您创建的匿名
Runnable
类中的代码不会阻止当前执行线程。以后再运行

该函数理论上可以写成:

public static void getBitmapFromWebview(WebView webView, final WhenReady callback){

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {

            callback.doSomethingWithBitmap(bitmap);
        }
    }, 2000);
}
然后在调用代码中实现WhenReady接口:

interface WhenReady {
     Bitmap doSomethingWithBitmap(Bitmap bitmap);
}

在处理程序上调用函数
handler.postDelayed
时,它将获取您创建的
Runnable
实例并将其存储在变量中。结束后,执行函数中的下一行

简单地说,在2000ms之后的某个时间,调用
Runnable
中的函数
run

因此,您看到的顺序是非常可预测的,您看到的结果也是如此

要掌握的核心概念是,您创建的匿名
Runnable
类中的代码不会阻止当前执行线程。以后再运行

该函数理论上可以写成:

public static void getBitmapFromWebview(WebView webView, final WhenReady callback){

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {

            callback.doSomethingWithBitmap(bitmap);
        }
    }, 2000);
}
然后在调用代码中实现WhenReady接口:

interface WhenReady {
     Bitmap doSomethingWithBitmap(Bitmap bitmap);
}

有道理,谢谢你。但是,是否有一种方法可以完全像我一开始打算的那样阻止一个函数呢?不推荐,尤其是当你在你的UI线程上时。如果在UI线程上阻止函数,应用程序将停止响应用户输入。但是一个简单的线程。sleep(2000),就可以了(我说,带着幽默,不要把我当回事)。不完全确定你的最终目标是什么?我尝试了睡眠,但效果不好。至于我在做什么。。。这有点复杂-我正试图从
webview
生成
bitmap
,但由于一些缩放问题,如果放大太多,可能会导致OOM崩溃,因此我正在开发一种解决方法。现在是“给函数更多的时间来处理一切”。这是一个悬赏案,虽然我想我已经弄明白了。是的,你需要开始为你的特例编程。这里有一个建议,如果可以的话,将位图保存在切片中。找到一个好的最大尺寸。一旦你超过这个尺寸,就把你的图像分成更小的四分之一。使用磁盘写入来帮助您远离ram。祝你好运顺便说一句,这个问题很酷(=)很有道理,非常感谢。但是,是否有一种方法可以完全像我一开始打算的那样阻止一个函数呢?不推荐,尤其是当你在你的UI线程上时。如果在UI线程上阻止函数,应用程序将停止响应用户输入。但是一个简单的线程。sleep(2000),就可以了(我说,带着幽默,不要把我当回事)。不完全确定你的最终目标是什么?我尝试了睡眠,但效果不好。至于我在做什么。。。这有点复杂-我正试图从
webview
生成
bitmap
,但由于一些缩放问题,如果放大太多,可能会导致OOM崩溃,因此我正在开发一种解决方法。现在是“给函数更多的时间来处理一切”。这是一个悬赏案,虽然我想我已经弄明白了。是的,你需要开始为你的特例编程。这里有一个建议,如果可以的话,将位图保存在切片中。找到一个好的最大尺寸。一旦你超过这个尺寸,就把你的图像分成更小的四分之一。使用磁盘写入来帮助您远离ram。祝你好运顺便说一下,这个问题很酷=)