Android->服务-java.lang.NullPointerException

时间:2014-10-23 09:39:42

标签: android service nullpointerexception progressdialog

我在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();
}

}

请帮我解决这个问题。

3 个答案:

答案 0 :(得分:0)

因为在您的情况下mainActivitynull。你没有初始化它。

答案 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>

最后,您可以在何时需要上下文时使用该类:)