2014-01-28 130 views
4

是否有可能在Activity.runOnUiThread()方法後返回一個值。在Activity.runOnUiThread()方法後返回一個值

runOnUiThread(new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     int var = SOMETHING; 

     // how to return var value.   
    } 
}); 

在這種post我看到,這是不可能的後Runnable.run()方法返回一個值。但是如何使用(實現)另一個接口並在執行後返回一個值。

希望所有人都清楚。

編輯

可以幫助別人。

我用@ Zapl的解決方案,並通過參數的Callable類的構造函數裏面,像這樣:

class MyCallable implements Callable<MyObject> { 

     int param; 

     public MyCallable (int param) { 
      // TODO Auto-generated constructor stub 
      this.param = param; 
     } 

     @Override 
     public MyObject call() throws Exception { 
      // TODO Auto-generated method stub 
      return methodReturningMyObject(this.param); 
     } 


    } 

回答

9

如果你真的想這樣做,你可以使用期貨和Callable這大概是一個Runnable但返回值。

final String param1 = "foobar"; 

    FutureTask<Integer> futureResult = new FutureTask<Integer>(new Callable<Integer>() { 
     @Override 
     public Integer call() throws Exception { 
      int var = param1.hashCode(); 
      return var; 
     } 
    }); 


    runOnUiThread(futureResult); 
    // this block until the result is calculated! 
    int returnValue = futureResult.get(); 

這也適用於內部call拋出的異常,將它們從get()重新拋出,您可以在調用線程通過

try { 
     int returnValue = futureResult.get(); 
    } catch (ExecutionException wrappedException) { 
     Throwable cause = wrappedException.getCause(); 
     Log.e("Error", "Call has thrown an exception", cause); 
    } 
+0

謝謝@Zapl。這真的是我想要的。 –

+0

我需要在可調用方法中傳遞一個參數。我已經更新了這個問題。非常感謝 –

+0

@mansoulx如果您將'int position;'重命名爲'int param',您應該有一個工作解決方案。否則,只需使用'final'局部變量作爲參數。編輯:添加最終的var示例來回答。 – zapl

0

的問題還有就是你需要處理final變量傳遞給runOnUiThread()方法,和這意味着你不能在裏面修改它們。但是,有一個技巧,您可以在runOnUiThread()之前聲明非基本數據結構,例如在要返回String的情況下爲String[]。當然,你需要將其聲明爲final

一旦完成,在runOnUiThread()方法簡單地分配您yourarray[0]要返回值,這樣你就可以,一旦你出的方法來訪問它後。

---- ----編輯

例子:

private void my_method() { 
    final String[] your_array = new String[1]; 

    ... 

    runOnUiThread(new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     int var = SOMETHING; 

     your_array[0] = "Hello!!!"; 

     // how to return var value.   
    } 
    }); 

    System.out.println("I've got a message! It says... " + your_array[0]); 
} 
+0

感謝回答

檢查。 ''''''''''''''''''''''你是什麼意思?':是否可以在runOnUiThread指令之後訪問它? –

+0

我已經用我的意思的例子更新了我的答案,我希望這就是你一直在尋找的。 – nKn

+2

這不能保證工作,因爲寫入'your_array [0]'的線程不能保證在那一刻完成。你得等一等。而且它在實踐中幾乎不會工作。 – zapl

相關問題