1

私はRoboGuiceを初めて使用し、DIを使用するようにアクティビティを設定しようとしています。しかし、使用しようとしても何も起こりません。「super.onCreate(savedInstanceState);」を呼び出した後、Activity.onCreate()メソッドにコンテンツがなく、ログインしていない空白の黒いウィンドウしか表示されません。

次の2つのコードスニペットを参照してください。

public class ClikClokActivity extends RoboActivity{
@Inject 
private TileAdapter tileAdapter;
@Inject
private GameLogicService gameLogicService;  
@Inject
private GridOperationQueue gridOperationQueue;
private GridView gridView;
@Inject
private Handler handler;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    Log.v(this.getClass().toString(), "Entering onCreate");

    super.onCreate(savedInstanceState);
    Log.v(this.getClass().toString(), "Never logs this with RoboGuice");
    setContentView(R.layout.main);
    gridView = (GridView) findViewById(R.id.gridview);
    gridView.setNumColumns(Constants.GRID_WIDTH);
    gridView.setAdapter(tileAdapter);

    Log.v(this.getClass().toString(), "GridView initialized");

    gridOperationQueue.start();

    Log.v(this.getClass().toString(), "Completed onCreate");
}

public class ClikClokApplication extends RoboApplication{

@Override
protected void addApplicationModules(List<Module> modules) {
    modules.add(new ClikClokModule());
}

}

パブリッククラスClikClokModuleはAbstractAndroidModuleを拡張します{

@Override
protected void configure() {

}

}

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.clikclok"
  android:versionCode="1"
  android:versionName="1.0">


<application android:name="com.clikclok.ClikClokApplication" android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".ClikClokActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

</application>

上記のコードを見ると、2回目のログは取得されません。ただし、代わりにActivityから拡張し、マニフェストからandroid:name = "com.clikclok.ClikClokApplication"属性を削除すると、2番目のログが取得されます(初期化が実行されていないため、NullPointersでは失敗します)。

したがって、super.onCreate(savedInstanceState);で何が起こっている可能性がありますか。それが私のアプリケーションを動作させない原因になっていますか?

ありがとう

上記からの更新:

私はこれを調査するのにかなりの時間を費やし、Eclipseのデバッガーを使用して、RoboGuice内のどこにコードがハングしているように見えるかを確認できるようになりました。

次のコードは、InjectorImplクラスからのものです。

public void injectMembers(Object instance) {
// Reaches here but...
MembersInjector membersInjector = getMembersInjector(instance.getClass());
// ....this comment is never reached
membersInjector.injectMembers(instance);

}

そこで、デバッガーを使用してGuice 3.0コードを掘り下げ、FailableCacheクラスを掘り下げました。

public V get(K key, Errors errors) throws ErrorsException {
// Reaches here....
Object resultOrError = delegate.get(key);
// ...but not here
if (resultOrError instanceof Errors) {
  errors.merge((Errors) resultOrError);
  throw errors.toException();
} else {
  @SuppressWarnings("unchecked") // create returned a non-error result, so this is safe
  V result = (V) resultOrError;
  return result;
}

}

これは、マップからキーを取得しているときにハングするだけである可能性がありますか?私はコードに精通しておらず、トラブルシューティングするのはかなり混乱しています。アドバイスをいただければ幸いです。

4

2 に答える 2

0

configure メソッドにバインディングを追加してみてください。

この @InjectView(R.id.gridview) GridView gridView; のようにグリッド ビューを挿入することもできます。

これがお役に立てば幸いです。

よろしく。

于 2011-11-24T21:51:06.377 に答える
0

これは、Activity クラスをサービス クラスに挿入しようとしたことが原因でした。

そのため、「Activity」ではなく「ClikClokActivity」のインスタンスを @Inject しようとしていました。

この注入の試みを削除すると、すべてが正常に機能しました。これにより、RoboGuice または Guice 自体に他の問題が発生するかどうかはわかりません。

于 2011-12-08T20:55:03.543 に答える