1

私は 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

ありがとうございました

4

1 に答える 1

1

必要なのはアプリケーションクラスを作成することだけだと思います

[1]他のほぼすべてのクラスで使用される、Util で取得した変数はすべて、この Application クラスで取得できます。したがって、これらの変数は他のすべてのクラスで使用できます。

[2] Appliction クラスの Singelton インスタンスを作成します。それについてちょうどGoogle。

[3] DataBaseHelper の Singleton も作成する (可能で適用できる場合) ため、単一のインスタンスがあらゆる場所で役立ちます。


アプリケーション クラスは Android のグローバル クラスであるため、これを使用してすべてのグローバル データを格納およびアクセスできます。例:

public class AppData extends Application {

    public static AppData appData;

    public int currentUserId; // etc.

    //Const.
    public AppData() {
        appData = this;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        loginPreferences = getSharedPreferences(
            SPF_NAME, 0);

        pathToSDCard = Environment.getExternalStorageDirectory().getAbsolutePath();
        System.out.println("Path : " + pathToSDCard);
       //etc.
    }

 //    MOST IMP  FOR GETTIN SINGELTON INSTANCE     <<<---<<<---<<<---
    public static AppData getAppData() {
        return appData;
    }
}

使い方はこちらをご覧ください

class ABC extends Activity {
    AppData appData;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.xyz);

        appData = AppData.getAppData();
        ...........
        ...........

        appData.VARIABLE_NAME...
    }
}

もう一つ。AndroidMenifest.xml 内

    ...
    ...
<application             //   In Application Tag
        android:name="PACKAGE_NAME.AppData"  //  <<  Add here class name in which you have extended Application
        android:icon="@drawable/ic_launcher"
    ...
    ...
于 2012-10-05T10:22:39.790 に答える