4

WebViewのサブクラスでは、getTitle()のオーバーライドされたメソッドにこれがあります。

      @Override
      public String getTitle() {
        Activity a = getVoTts().getActivity();
        a.runOnUiThread(new Runnable() {
            public void run() { 
                String tit = VoWebView.super.getTitle();
            }
        });


       String title = tit;  // this is what I WANT to do, it won't compile of course
       ...
       ...
      }

ただし、Stringtitは匿名のRunnableクラスで閉じられているため、もちろんメソッドからアクセスすることはできません。

匿名のRunnableクラスで取得した値を(同じメソッド内の)ステートメントに渡したり、データメンバーに割り当てたりするための手法または「トリック」はありますか?

4

4 に答える 4

5

1つの方法は、インスタンスフィールドを宣言し、それをクラス全体で使用することです。例えば:

private String someText;

// ...

@Override
public String getTitle()
{
    Activity a = getVoTts().getActivity();
    a.runOnUiThread(new Runnable()
    {
        public void run()
        {  
            someText = VoWebView.super.getTitle();
        }
    });
}

編集:

ローカル変数をfinal(つまり、コンパイル時定数)として宣言する必要がある理由について:

以下がJavaで有効であると想像してください。

@Override
public String getTitle()
{
    Foo f = new Foo();

    Button b = getButtonReference();
    b.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v)
        {  
            Boo o = f.someMethod();
        }
    });

    f = null;
}

f = null、fooオブジェクトはガベージコレクションの対象になります。したがって、ボタンをクリックすると、someMethod()ガベージコレクションが行われるため、VMがfooオブジェクトを呼び出すには遅すぎます。

于 2013-01-01T21:03:39.120 に答える
1

FutureTaskは次のように使用できます。

FutureTask<String> task = new FutureTask<String>(new Callable<String>() {
    @Override
    public String call() throws Exception {
        // Compute your string
    }
});

runOnUiThread(task);
String title = task.get();
于 2014-01-03T14:28:34.370 に答える
1

グローバル変数を宣言してみませんか。

 private String title;

  @Override
  public String getTitle() {
    Activity a = getVoTts().getActivity();
    a.runOnUiThread(new Runnable() {
        public void run() { 
            title = VoWebView.super.getTitle();
        }
    });
  }
于 2013-01-01T21:05:34.853 に答える
0

アップデート

コメントによると、.runOnUiThread()ランナブルを非同期で実行します。つまり、「行のステートメント」に到達するまでにタスクが実行されている場合と実行されていない場合があります。その場合、メソッドの残りの部分でこれらのステートメントの結果を取得することは不可能です (そして、ここでの解決策はどれも役に立ちません)。

于 2013-01-02T10:21:19.883 に答える