我在Android应用中使用了一项服务来同步进程。现在我想添加一个进度条来显示正在进行同步过程。但是当启动时,服务应用程序停止显示以下错误。但我不知道为什么会这样,
错误,
10-23 05:27:56.390: E/AndroidRuntime(25458): FATAL EXCEPTION: Timer-0
10-23 05:27:56.390: E/AndroidRuntime(25458): Process: com.abc, PID: 25458
10-23 05:27:56.390: E/AndroidRuntime(25458): java.lang.NullPointerException
10-23 05:27:56.390: E/AndroidRuntime(25458): at com.abc.service.SynchingService$1.run(SynchingService.java:51)
10-23 05:27:56.390: E/AndroidRuntime(25458): at java.util.Timer$TimerImpl.run(Timer.java:284)
这是我的服务代码,
public class SynchingService extends Service {
private Timer t;
private static MainActivity mainActivity;
ProgressDialog dialog;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
this.timer();
return Service.START_STICKY;
}
private void timer() {
t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
mainActivity.runOnUiThread(new Runnable() {
public void run() {
dialog = ProgressDialog.show(mainActivity, getString(R.string.dialog_saving), getString(R.string.dialog_please_wait));
}
});
callSync();
}
}, 1000, 1000 * 60 * 60);
}
/**
* This method is used to call every table to start syncing
*
* @param Nothing
* @return No return value
*/
private void callSync() {
DataManager datamanager = DataManager.getInstance(getApplicationContext());
Log.d("service", "running");
// sync contact data
ContactSync contactSync = new ContactSync();
contactSync.contactGroupSync();
contactSync.contactSync();
Log.d("service2", "running2");
// sync horse data
HorseSync horseSync = new HorseSync();
horseSync.horseSyncWithServer();
Log.d("service3", "running3");
// sync blog data
BlogSync blogSync = new BlogSync();
blogSync.blogSyncWithServer();
Log.d("service4", "running4");
// delete news categories from local DB.
datamanager.deleteNewsCategories(MainActivity.mainActivity);
// delete news from local DB.
datamanager.deleteNews(MainActivity.mainActivity);
// delete advertisement categories from local db.
datamanager.deleteAddCategories(MainActivity.mainActivity);
// delete advertisements from local db.
datamanager.deleteAdds(MainActivity.mainActivity);
dialog.dismiss();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
请帮我解决这个问题。
答案 0 :(得分:0)
因为在您的情况下mainActivity
是null
。你没有初始化它。
答案 1 :(得分:0)
您忘记初始化mainActivity
变量,因此此行会导致崩溃:
mainActivity.runOnUiThread
从服务中显示对话框通常不是一个好主意,请阅读this question及其接受的答案以获取详细信息。
您可以从UX的角度来看这个:如果您使用Service
来同步数据,无论您的应用是否开放,这意味着您要显示Dialog
(从而阻止用户界面)当用户在他的设备上执行完全不同的任务,与您的应用程序无关时,您的应用程序正在同步,我认为我们可以同意这很糟糕。或者,您只能在应用程序处于打开状态时使用Service
同步数据,在这种情况下,您只需使用AsyncTask
。
答案 2 :(得分:0)
我认为您应该为项目添加新类以获取上下文
所以你可以这样做:
添加新类并从Application
扩展它public class MyApplication extends Application{
private static Context context;
public void onCreate(){
super.onCreate();
MyApplication.context = getApplicationContext();
}
public static Context getAppContext() {
return MyApplication.context;
}
}
并在清单声明它:
<application android:name="com.xyz.MyApplication">
</application>
最后,您可以在何时需要上下文时使用该类:)