2017-08-11 37 views
0

因此,我有一個public static Bitmap,其中延遲了2000密耳。我的問題是我得到return之前執行延遲的代碼。Android公開在延遲結束之前返回位圖函數返回

給你我的功能結構的想法:

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

我已經設置了2個調試消息 - 延遲部分內部,return前一個權利。

下面是我在logcat中得到:

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) 

回答

2

當您的處理程序調用函數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); 
} 
+0

有道理,多謝。但是,是否還有一種方法可以完全像我打算的那樣完全阻止一個功能? –

+0

不推薦,特別是如果你在你的UI線程。如果您在UI線程上阻止某個功能,則您的應用程序將停止響應用戶輸入。但是一個簡單的Thread.sleep(2000)就可以做到這一點(我認爲幽默不要把我當回事)。不完全確定你想要完成的總體目標是什麼? –

+0

我嘗試過'睡眠',但是效果不好。至於我在做什麼......這有點複雜 - 我試圖從'webview'生成一個'bitmap',但由於一些縮放問題,如果我放大太多,我可以讓OOM崩潰,所以我正在開發一種解決方法。現在它是「給功能更多的時間來處理所有事情」。這裏的[線程](https://stackoverflow.com/questions/45588882/getting-bitmap-from-webview-generates-outofmemory-crash)與賞金,雖然我想我已經明白了這一點。 –

2

我的問題是,我得到在執行延遲的代碼之前返回。

the documentation所述,postDelayed()不會延遲您調用它的方法。它安排Runnable在指定的延遲時間後運行。希望能在幾微秒內返回getBitmapFromWebview()