私は Android プログラミングに不慣れで、Java を完全に勉強したことがありません。synchronized
でスレッドセーフを確保するために使用する方法について、私は本当に混乱していますstatic variables
:
私は通常、他のすべてのクラスでほとんどの場合必要とされるUtils
名前のクラスを作成します。static functions
これは、反復的なコードをクラスから除外する正しい方法ですか?
私はいつもデータベースの使用に関する問題に悩まされています。特定のデータベースの sqliteHelper クラスを作成し、そのデータベースをアクティビティやバックグラウンド サービスなどから管理しようとすると、通常、問題が発生します。ヘルパー クラスのローカル オブジェクトを使用すると、両方のヘルパー オブジェクトが一緒に書き込みロックを取得しようとすると、データベースのデッドロックが発生する可能性が最も高くなります。
この問題を解決するためstatic
に、クラスにヘルパー クラスのインスタンスを作成しますutils
。データベースで操作を実行するには、私のアクティビティとサービスで次のことを行います。
public class Utils{
public static MDatabaseHelper mHelper;
public static void instantiateHelper(Context context){
if(mHelper==null)
mHelper=new MDatabaseHelper(context);
}
}
public class mActivity extends Activity{
public void insert some item in database(final Item item) // this method is called in the Activity at some time
(new Thread(){
@Override public void run(){
Utils.instantiateHelper(getBaseContext());
mHelper.insertItem(item); }
}).start();
}
public class mService extends Service{
public void insert some item in database(final Item item) // this method is called in the service at some time
(new Thread(){
@Override public void run{
Utils.instantiateHelper(getBaseContext());
mHelper.insertItem(item); }
}).start();
}
ここで、サービスとアクティビティの両方がアイテムを一緒に挿入しようとするとどうなるでしょうか。私はしばしばこの状況に陥り、エラーが発生します。これを回避するには、次の回避策を使用します。
挿入操作をtryブロックに入れ、失敗した場合はランダムな時間を待ってから再試行します
public void insertSomeItemInDatabase(final Item item)
(new Thread(){
@Override public void run(){
int i=0;
Random rand=new Random();
while(true){
if(i>10)
return;
try{
Utils.instantiateHelper(getBaseContext());
mHelper.insertItem(item);
break;
}catch(Exception e){
i++;
try{
Thread.sleep(rand.nextInt(1000));
}catch(Exception e){}
}
}
}
}
}).start();
}
これが最悪の同期方法であることは承知していますが、初心者なので、このシナリオでのjava
使用方法を説明してください。synchronized
ありがとうございました