Java 如何在活动类中实现单例类

Java 如何在活动类中实现单例类,java,android,singleton,Java,Android,Singleton,我想在整个申请中提供我的单一培训。让我们从main activity listview中进行每个培训。但我并没有从Singleton类中得到这些值。我的代码有什么问题。我从昨天开始就一直在尝试,不知道为什么??提前谢谢你的帮助 这是一节单人课: public class CurrentTraining { private Training training; //Training is my model class. private static CurrentTraining instan

我想在整个申请中提供我的单一培训。让我们从main activity listview中进行每个培训。但我并没有从Singleton类中得到这些值。我的代码有什么问题。我从昨天开始就一直在尝试,不知道为什么??提前谢谢你的帮助

这是一节单人课:

public class CurrentTraining {

private Training training; //Training is my model class.

private static CurrentTraining instance;

private CurrentTraining() {

}

public static CurrentTraining getInstance() {
    if (instance == null)
        instance = new CurrentTraining();
    return instance;

}

public Training getTraining() {
    return training;
}

public Training setTraining(Training training) {
    return this.training = training;
}
}

我的主要活动课:

public class MainActivity extends ListActivity implements OnItemClickListener {

private Portfolio portfolio;

private ListAdapter trainingListAdapter;

private Dialog dialog;

Training currentTraining;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    currentTraining = CurrentTraining.getInstance().getTraining();

    portfolio = new Portfolio(this);

    trainingListAdapter = new ArrayAdapter<Training>(this,
            android.R.layout.simple_list_item_1,
            portfolio.getTrainingArrayList());

    setListAdapter(trainingListAdapter);

    ((ListView) findViewById(android.R.id.list))
            .setOnItemClickListener(this);
}

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

    Log.i ("DEBUG" , currentTraining.getTitle());
    CurrentTraining.getInstance().setTraining(currentTraining);

    Toast.makeText(getApplicationContext(), "You clicked on position : " + arg2 + " and ID : " + currentTraining.getId(), Toast.LENGTH_LONG).show();
    }

单击列表视图时,它会因NullPointer异常而崩溃。

在onCreate中,您可以执行以下操作:

currentTraining = CurrentTraining.getInstance().getTraining();
我认为,由于您还没有设置它,它将返回null。当您输入onItemClick时,您将使用登录

currentTraining.getTitle()
这可能会导致NullPointerException。尝试使用登录

Log.i ("DEBUG" , currentTraining);

首先要确保它不是空的。

这一行有一个NPE

Log.i DEBUG,currentTraining.getTitle

因为currentTraining为空。单例静态方法GetInstance初始化实例字段,但不初始化getTraining返回的字段

没有设置过值,如何获取值


Personnaly建议不要在Android开发中使用单例。您已经有一个单例对象->应用程序对象。您可以通过一个简单的getter和setter来管理所有的singleton。在您的活动中,是否只需调用MyApplicationgetApplication.getSingletonObjectSingleton活动?不要那样做!他不是在创造一个单身活动!通常,user1281750方法将是最基本的方法。但是你能给我们看看LogCat吗?@user1281750我一点也不懂你的意思。可能是您试图说应用程序扩展了应用程序{}。我不想用那个。我只是需要帮助,在这种情况下,我可以在我的活动课中实施当前的培训课程吗。谢谢..请编辑您的帖子并插入[CODE]brakets整体stacktrace PLS在调用getTraining.getTitle并检查null之前,您必须调用setTrainingvalues@blackbelt-它为currentTraining提供空值。为什么会这样?因为当您在onCreate中检索时,它还不是initialized@blackbelt-甚至我在onCreate上也这样设置;currentTraining=currentTraining.getInstance.setTrainingcurrentTraining;Log.iDEBUG,+currentTraining;该值为空。你能看看我的单人课CurrentTraining.java吗。如果我做的是正确的方式?在你的singleton CurrentTraining上设置一个训练实例对我来说没有意义。在创建培训的arraylist时从列表中选择一个实例之前,可能会提供一个默认实例。我已经接受了新的培训。所以我不想再做新的了。相反,我想使用相同的训练对象。你给我的密码不起作用向我展示新培训的代码,我没有看到“新培训”isI在哪里有公文包类,在那里我有获得培训的方法arraylist。在那里我进行了一次新的训练。[Training Training=new Training;Training.setIdcursor.getIntcursor.getColumnIndexDatabaseHelper.Training\u ID;this.trainingArrayList.addtraining;]我为trainingArrayList设置了getter和setter。您没有在方法onItemClick中设置currentTraining,我已经更改了答案,您可以再试一次。效果很好:谢谢:
Log.i ("DEBUG" , currentTraining.getTitle());
    CurrentTraining.getInstance().setTraining(currentTraining);
 @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        currentTraining = (Training)arg0.getAdapter().getItem(arg2);
        Log.i ("DEBUG" , currentTraining.getTitle());

        CurrentTraining.getInstance().setTraining(currentTraining);

        Toast.makeText(getApplicationContext(), "You clicked on position : " + arg2 + " and ID : " + currentTraining.getId(), Toast.LENGTH_LONG).show();
        }