ヘルパークラス(非アクティビティ)クラスに情報を渡すアクティビティクラスがあります。ヘルパークラスでは、getSharedPreferences()
を使用します。ただし、アクティビティコンテキストが必要なため、使用できません。
これが私のコードです:
class myActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.home);
Info = new Authenticate().execute(ContentString).get();
ItemsStore.SetItems(Info);
}
}
class ItemsStore
{
public void SetItems(Information info)
{
SharedPreferences localSettings = mContext.getSharedPreferences("FileName", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = localSettings.edit();
editor.putString("Url", info.Url);
editor.putString("Email", info.Email);
}
}
どうすればこれを達成できるのでしょうか?
これを試して:
class myActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.home);
Info = new Authenticate().execute(ContentString).get();
ItemsStore.SetItems(Info, getApplicationContext());
}
}
class ItemsStore
{
public void SetItems(Information info, Context mContext)
{
SharedPreferences localSettings = mContext.getSharedPreferences("FileName",
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = localSettings.edit();
editor.putString("Url", info.Url);
editor.putString("Email", info.Email);
}
}
(クラスフィールドにアクティビティコンテキストを保持することにより)メモリリークを作成する代わりに、共有設定にはアクティビティコンテキストは必要ありませんが、コンテキストは必要ないため、このソリューションを試すことができます。
public class MySuperAppApplication extends Application {
private static Application instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public static Context getContext() {
return instance.getApplicationContext();
}
}
<application
...
Android:name=".MySuperAppApplication" >
...
</application>
public void persistItems(Information info) {
Context context = MySuperAppApplication.getContext();
SharedPreferences sharedPreferences = context.getSharedPreferences("urlPersistencePreferences", Context.MODE_PRIVATE);
sharedPreferences.edit()
.putString("Url", info.Url)
.putString("Email", info.Email);
}
メソッドシグネチャは外部コンテキストを必要としないため、この方法で見栄えが良くなります。これは、いくつかのインターフェースの下に隠すことができます。依存関係の注入にも簡単に使用できます。
HTH
非アクティビティクラスのコンストラクタにコンテキストを渡す必要があります
ItemsStore itemstore = new ItemStore(myActivity.this);
itemstore.SetItems(Info);
その後
Context mContext;
public ItemsStore (Context context)
{
mContext =context;
}
mContext
をアクティビティコンテキストとして使用できるようになりました。
注:コンテキストアクティビティへの長期間有効な参照を保持しないでください(アクティビティへの参照は、アクティビティ自体と同じライフサイクルを持つ必要があります)
アクティビティにパブリック関数を記述します。 Activityクラスでヘルパークラスのインスタンスを作成するときに、アクティビティーのコンテキストをコンストラクターで渡します。
次に、ヘルパークラスから、アクティビティコンテキストを使用して、アクティビティクラスのパブリック関数を呼び出します。