我是android编程的新手,之前没有彻底研究过java。我真的很困惑如何使用synchronized
来确保static variables
上的线程安全:
我通常创建一个名为Utils
的类,它有一些static functions
,这是我所有其他类所需的大部分时间。这是将重复代码排除在我的课程之外的正确方法。
我总是遇到使用数据库的问题。当我为某些数据库创建sqliteHelper类并尝试从一个Activity和一个后台服务来管理该数据库时,我通常会得到 陷入麻烦。如果我使用辅助类的本地对象,当辅助对象尝试同时获取写锁时,我最容易陷入数据库死锁。
为了解决这个问题,我在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
。
谢谢
答案 0 :(得分:1)
我认为您需要创建应用程序类
[1] 您在Util中使用的所有变量(在所有其他类中使用)都可以在此Application类中使用。所以这些变量将可用于所有其他类。
[2] 创建应用类的Singelton实例。就谷歌而言。
[3] 还要创建Singleton of DataBaseHelper(如果可能并且可以应用),因此,单个实例可以帮助您到处。
Application Class是android中的Global类,因此您可以使用它来存储和访问所有Global-Data。例如:
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"
...
...