13

最初のAndroidアプリでロジックの一部をカプセル化するライブラリクラスを作成しています。カプセル化したい関数の1つは、アドレス帳を照会する関数です。そのため、が必要ContentResolverです。ライブラリ関数をブラックボックス化する方法を理解しようとしています...つまり、Activityを取得するために独自のコンテキストで各パスを使用しないようにしContentResolverます。

ContentResolver問題は、ライブラリ関数内からを取得する方法を一生理解できないことです。を含むインポートが見つかりませんgetContentResolver。グーグルは、を呼び出すgetContextために使用すると言いましたが、どちらかを含むインポートが見つかりません。次の投稿は、呼び出すオブジェクトを取得するために使用すると言われています。しかし、どちらかを含むインポートが見つかりません!ContextgetContentResolvergetContextgetSystemServicegetContextgetSystemService

だから私は疑問に思っています、カプセル化されたライブラリ関数内でContentResolverを取得するにはどうすればよいですか、それともActivityそれ自体のコンテキストへの参照ですべての呼び出しパスを持っているのでかなり行き詰まっていますか?

私のコードは基本的に次のようなものです。

public final class MyLibrary {
    private MyLibrary() {  }

    // take MyGroupItem as a class representing a projection
    // containing information from the address book groups
    public static ArrayList<MyGroupItem> getGroups() {
        // do work here that would access the contacts
        // thus requiring the ContentResolver
    }
}

getGroupsは、を渡す必要がないように、ContextまたはContentResolver可能であれば、それをきれいにブラックボックス化することを望んでいたために探していたメソッドです。

4

4 に答える 4

10

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

getApplicationContext().getContentResolver() with the proper context.
getActivity().getContentResolver() with the proper context.
于 2013-10-11T07:37:40.557 に答える
8

各ライブラリ関数呼び出しにContentResolver...を渡すか、拡張Applicationしてコンテキストを保持し、静的にアクセスします。

于 2011-02-04T19:33:53.623 に答える
5

将来このスレッドを見つける可能性のある人のために、これをやった方法は次のとおりです。

私はsugarynugsのクラスを作成するメソッドを使用extends Applicationし、アプリケーションマニフェストファイルに適切な登録を追加しました。私のアプリケーションクラスのコードは次のとおりです。

import android.app.Application;
import android.content.ContentResolver;
import android.content.Context;

public class CoreLib extends Application {
    private static CoreLib me;

    public CoreLib() {
        me = this;
    }

    public static Context Context() {
        return me;
    }

    public static ContentResolver ContentResolver() {
        return me.getContentResolver();
    }
}

次に、ライブラリクラスでContentResolverを取得するために、関数コードは次のようになります。

public static ArrayList<Group> getGroups(){
    ArrayList<Group> rv = new ArrayList<Group>();

    ContentResolver cr = CoreLib.ContentResolver();
    Cursor c = cr.query(
        Groups.CONTENT_SUMMARY_URI, 
        myProjection, 
        null, 
        null, 
        Groups.TITLE + " ASC"
    );

    while(c.moveToNext()) {
        rv.add(new Group(
            c.getInt(0), 
            c.getString(1), 
            c.getInt(2), 
            c.getInt(3), 
            c.getInt(4))
        );          
    }

    return rv;
}
于 2011-02-06T03:06:30.657 に答える
2

ライブラリのコーディング方法を詳しく説明しないと少し難しいですが、コンテキストを使用するための別のオプションが表示されないため、そのクラスを呼び出すときにそれを渡します。

'random'クラスには、contentresolverを取得するための環境がありません。コンテキストが必要です。

これで、(アクティビティ)コンテキストを実際にクラスに渡すのはそれほど奇妙ではありません。http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.htmlから

Androidでは、コンテキストは多くの操作に使用されますが、主にリソースの読み込みとアクセスに使用されます。これが、すべてのウィジェットがコンストラクターでContextパラメーターを受け取る理由です。通常のAndroidアプリケーションでは、通常、アクティビティとアプリケーションの2種類のコンテキストがあります。これは通常、開発者がコンテキストを必要とするクラスとメソッドに渡す最初のものです。

(強調鉱山)

于 2011-02-04T19:34:44.550 に答える