2012-01-21 2 views
2

内部クラス/リスナーの外にオブジェクトを取得する:(私の主な活動は、この関数を呼び出す私は最終的にインターフェイス/リスナーとAsyncTask(DogAsyncTask)(DogListener)のうちのオブジェクトを取得するために管理

public String fout(String url) { 

    Dog d_in = new Dog("DogName"); 
    DogAsyncTask task = new DogAsyncTask(d_in); 

    final String out = ""; <---Have tried but error for out becomes "The final local variable out cannot be assigned, since it is defined in an enclosing type" 
    task.setDogListener(new DogListener() 
    { 
     @SuppressWarnings("unchecked") 
     @Override 
     public void DogSuccessfully(String data) { <---The string I want to get 
      Log.e("DogListened", data); 
      out = data; 
     } 

     @Override 
     public void DogFailed() {} 
    }); 

    task.execute(url); 
    return out; 
} 

FOUT )、それからストリングを取得するはずです。文字列データはすでに存在し、Log.e( "DogListened"、data);それも記録する。それを私の主な活動にどのように戻すことができますか?私はデータを設定しようとしましたが、外側には最終的なStringを作成しましたが、「囲むタイプで定義されているため、最終的なローカル変数outを割り当てることはできません」というエラーが表示されます。どうすればこの問題を回避できますか?私はそれがリスナーの範囲外であるので、あなたがoutにアクセスすることができないと思います

おかげ

+0

「アウト」を「最終」と宣言する必要があるのはなぜですか? –

+0

それはちょうど試みたものでした。他の人が内部クラスからそれを得るためのファイナンスとして宣言しているからです。 –

+0

最後に、あなたが最終的なキーワードなしでそれを宣言し、あなたの活動の範囲で宣言することをお勧めします。それから、その値にアクセスして値を変更することができます。 –

答えて

1

。おそらくoutを参照パラメータとしてDogListenerのコンストラクタに渡すことができます。

final String out = "";  
task.setDogListener(new DogListener(**out**) 
{ 
    @SuppressWarnings("unchecked") 
    @Override 
    public void DogSuccessfully(String data) { 
     Log.e("DogListened", data); 
     out = data; 
    } 

    @Override 
    public void DogFailed() {} 
}); 

は、正直なところ、私は... C#でのようなJavaの基準とパラメータを渡す方法を知らない

EDIT:

これはあまりにもあなたを助けることができます。Can I pass parameters by reference in Java?

0

使用を基本的にフィールドに値を格納するオブジェクトです。バリューホルダーはファイナルとして割り当てることができますが、値を変更することはできます。このパターンの詳細については、リンクを参照してください:http://martinfowler.com/eaaCatalog/lazyLoad.html

しかし、値ホルダーとして文字列を使用することができます:割り当てられた空の文字列に追加するだけです。または、StringBufferオブジェクトを使用することをお勧めします。

関連する問題