GVKun编程网logo

Java静态变量变为null(java中静态变量)

20

在本文中,您将会了解到关于Java静态变量变为null的新资讯,同时我们还将为您解释java中静态变量的相关在本文中,我们将带你探索Java静态变量变为null的奥秘,分析java中静态变量的特点,并

在本文中,您将会了解到关于Java静态变量变为null的新资讯,同时我们还将为您解释java中静态变量的相关在本文中,我们将带你探索Java静态变量变为null的奥秘,分析java中静态变量的特点,并给出一些关于android – 在onPageSelected()中访问时,片段成员变量变为null、FreeMarker调用Java静态方法以及静态变量的方法、java – 为什么我的ListView在片段中的方向更改后变为null?、java – 升级到Roboguice 3后,注入的对象变为null的实用技巧。

本文目录一览:

Java静态变量变为null(java中静态变量)

Java静态变量变为null(java中静态变量)

我有一个android java类,其中一个静态实例保存用户的信息.但是,在一些用户使用我的应用程序的极少数情况下,该静态实例中的一个变量在一段时间后变为null.这个java类是全局的(不附加到任何活动).可能是什么导致了这个?

编辑:除了在应用程序启动期间,变量永远不会更改.我已经检查过调用它的函数永远不会被调用多次(adb logcat证明当我添加一个日志表明它正被调用时).

代码是这样的:

class UserCore
{
    class UserData
    {
        int ID;
        string Name;
    }

    public UserData User;
    public static UserCore Instance = new UserCore();

    public void Login()
    {
        Log.d("User", "Logging in");
        new Throwable().printstacktrace();

        User = null;
        //Fetch user data
        User = new UserData();
        User.ID = ...
        User.Name = ...
    }
    ....
}

解决方法:

如果用户让手机进入睡眠状态并且系统需要或清除内存,通常会发生这种情况.最好将需要较长时间的信息保存到磁盘缓存中,而不是仅将其保存在静态变量中.如您所知,Android系统对何时清除应用程序有最终决定权,只保留静态变量中非常短的交互所需的数据.

android – 在onPageSelected()中访问时,片段成员变量变为null

android – 在onPageSelected()中访问时,片段成员变量变为null

我正在使用FragmentPagerAdapter和FragmentActivity来创建可滑动的片段.

我在pagerAdapter中的第一个片段看起来像这样.

public class MySummaryFragment extends CommonFragment implements OnPagechangelistener 
{
   private Context mContext;
   private View mMyView;

LinearLayout mDetailLayout;
TextView mDateTxtView;

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
    System.out.println("onCreateView() Market summary");
    mMyView = inflater.inflate(R.layout.my_page_summary_fragment_layout,container,false);
    mDetailLayout = (LinearLayout)mMyView.findViewById(R.id.SummaryDetailLayout);
    mDateTxtView = (TextView) mMyView.findViewById(R.id.txtDate);

    Account_Id = AccountDetails.getInstance(mContext).getClientCodes().get(0);
    sendRequest(Account_Id);

    return mMyView;

}


 @Override
public void onPageSelected(int arg0) {
    System.out.println("inside onPageScrollStateChanged()");
    System.out.println("mMyView is null ? = "+(mMyView==null));
    mDateTxtView = (TextView) mMyView.findViewById(R.id.txtMarketSummaryDate);
    Account_Id = AccountDetails.getInstance(mContext).getClientCodes().get(0);
        mDateTxtView.setText("");   
            sendRequest(Account_Id);
}
}

这里的问题是当刷出5-6个片段并向后滑动到第一个片段时,我得到NullPointerException.

当我尝试调试时,我发现了

mMyView is null ? = true

为什么这样?

请帮我.

这是我的片段包含FragmentPagerAdapter,

public class MyPageDetailViewFragment  extends CommonFragment  {
private View mView;
Context mContext;
OnPagechangelistener pagechangelistener;


@Override
public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) {
    mView = inflater.inflate(R.layout.my_page_fragments,null);
    mContext = getActivity();

    setHasOptionsMenu(false);

    setupSearchBarComponent();


    PagerTabStrip pagerTabStrip = (PagerTabStrip)mView. findViewById(R.id.pager_title_strip);
    pagerTabStrip.setDrawFullUnderline(true);
    pagerTabStrip.setTabIndicatorColor(Color.BLACK);

    /** Getting a reference to the ViewPager defined the layout file */        
    ViewPager pager = (ViewPager) mView.findViewById(R.id.pager);

    /** Getting fragment manager */
    FragmentManager fm = ((HomeScreenActivity)mContext).getSupportFragmentManager();

    /** Instantiating FragmentPagerAdapter */
    final MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);

    pager.setAdapter(pagerAdapter);

    pager.setCurrentItem(0);


    pagechangelistener = new OnPagechangelistener() {

        @Override
        public void onPageSelected(int selectedindex) {
            System.out.println("selectedindex = "+selectedindex);
            Object page  = pagerAdapter.getItem(selectedindex);
            if( page instanceof OnPagechangelistener){
                ((OnPagechangelistener) page).onPageSelected(selectedindex);
            }
        }

        @Override
        public void onPageScrolled(int arg0,float arg1,int arg2) {

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {

        }
    };



    pager.setonPagechangelistener(pagechangelistener);

    return mView;
    //      return super.onCreateView(inflater,savedInstanceState);
}

这是我的实现MyFragmentPagerAdapter,

public class MyFragmentPagerAdapter extends FragmentPagerAdapter {


/** Constructor of the class */
public MyFragmentPagerAdapter(FragmentManager fm) {
    super(fm);
}

/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int index) {

    System.out.println("getItem = "+index);
    Bundle data = new Bundle();
    data.putInt("current_page",index + 1);

    CommonFragment fragment = getFragment(index);

    fragment.setArguments(data);

    return fragment;
}


public CommonFragment getFragment(int index) {
    CommonFragment fragment = null;
    if(fragment == null){
        if(index == 0){
            fragment = new MySummaryFragment();
        }else if(index == 1){
            fragment = new FragmentOne();
        }else if(index == 4){
            fragment = new FragmentFour();
        }else if(index == 5){
            fragment = new FragmentFive();
        }else{
            fragment = new MyFragment();
        }
    }
    return fragment;
}

/** Returns the number of pages */
@Override
public int getCount() {
    return titles.length;
}

@Override
public CharSequence getPageTitle(int position) {
    return titles[position];
}

}
最佳答案
pagerAdapter.getItem(selectedindex)实际上创建了片段的新实例.

看到这个答案:https://stackoverflow.com/a/23843743/1271907

您必须保留对实际片段的引用.

FreeMarker调用Java静态方法以及静态变量的方法

FreeMarker调用Java静态方法以及静态变量的方法

这里介绍下在类似 Spring+FreeMarker 的架构中如何在FreeMarker中访问Java中的静态方法以及静态变量

一、首先为了方便以及可复用我们创建一个工具类

/**
 * FreeMarker Utils.
 *
 * @author chenxinyu
 */
public abstract class FreeMarkerUtils {

    /**
     * init for static classes and fields.
     *
     * @param model model
     */
    public static void initStatics(final Model model) {
        // you can also create the Version like: new Version("2.3.27");
        BeansWrapper wrapper = new BeansWrapper(new Version(2, 3, 27));
        TemplateModel statics = wrapper.getStaticModels();
        model.addAttribute("statics", statics);
    }

}

这里稍作解释:

`wrapper.getStaticModels()` 会返回一个 `TemplateHashModel` ,它会利用反射公开所有的静态方法和静态成员变量,包括 final 和 非final 的
之后我们将这个 `HashModel` 添加至 Spring 的 Model 参数里面。

二、之后在我们的 `Controller` 里面调用如上代码即可:
FreeMarkerUtils.initStatics(model);

三、现在我们就可以在 FreeMarker 的 `.ftl` 文件中调用静态方法和静态变量了:

1.访问静态变量:
${statics["com.springboot.constants.TestConstants"].NAME}

引号中间填入静态变量所在的类路径,中括号后面使用 . 来调用相应变量就行。

2.访问静态方法:
I.首先我们使用 <#assign> 来定义下所要调用的类:
<#assign DateTimeUtils=statics[''com.springboot.util.DateTimeUtils'']>

II.之后就可以尽情调用了:
${DateTimeUtils.formatDateTime(datetime)}

虽然网上搜罗出过不少其他解决方案的版本,但自己在沿用的过程中出现过些许不同的坑,于是重新整理了这套可行、可用,且暂未过期的方案,以前所使用的 `new BeansWrapper()` 以及 `BeansWrapper().getDefaultInstance()` 现在均已过期(被标记为 @
Deprecated),新的 BeansWrapper 需要利用 BeansWrapperBuilder 来创建。

java – 为什么我的ListView在片段中的方向更改后变为null?

java – 为什么我的ListView在片段中的方向更改后变为null?

在我的一个片段中,我有一个从父Activity调用的方法.该方法没什么特别的,它只是将我的ListView滚动到一个位置.

public void scrollToSomething() {
    mListView.smoothScrollToPosition(The position I supply);
}

当我最初调用这个方法时,它就像我期望的那样工作,但是当我旋转我的设备并再次调用它时,我从ListView中抛出一个NullPointerException.我很遗憾为什么会这样.我试过调用setRetainInstance(true).在调用方法之前,我已经尝试检查我的ListView是否为null,如果是,那么我再次初始化它,但这也不起作用.我试过用几种不同的方式改变我的onCreateView,想想可能出现问题.

onCreateView

  @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    /* The View for the fragment's UI */
    final ViewGroup mRootView = (ViewGroup)inflater.inflate(R.layout.fragment_list_base,
            container, false);
    /* Initialize our ListView */
    mListView = (ListView)mRootView.findViewById(R.id.fragment_list_base);
    return mRootView;
}

Fragment使用简单的FragmentStatePagerAdapter附加到ViewPager.我已经仔细查看了我的Fragment的onDestroy方法和父Activity,看看我是否正在调用可能导致错误的东西,但没有什么突出的.我不确定我遇到的是某种错误,或者我只是忽略了什么.任何帮助或建议都会很大.我不完全确定还有什么要补充的,因为我很遗憾为什么会这样,但如果有人有问题,我会发布你认为合适的任何代码.

解决方法:

这可能对你有所帮助

如果你的android:targetSdkVersion =“12”或更少:

android:configChanges="orientation|keyboardHidden">

如果你的android:targetSdkVersion =“13”或更多:

android:configChanges="orientation|keyboardHidden|screensize">

java – 升级到Roboguice 3后,注入的对象变为null

java – 升级到Roboguice 3后,注入的对象变为null

我刚刚升级了我们的项目以使用Roboguice 3,突然间所有注入的对象都变为null,包括POJO,Providers,Views,Resources等.我正在努力弄清楚原因.

首先是gradle构建文件,试用Proguard开启和关闭它并没有什么区别.我相信我们目前正在使用Roboguice 3.0.1,但我尝试了3.0并仍然遇到了问题.

compile ('org.roboguice:roboguice:3.+') {
    exclude module: 'asm'
}
provided 'org.roboguice:roboblender:3.+

我们在模块文件中有一些自定义绑定,所以这是我如何根据wiki指定它:

<Meta-data
  android:name="roboguice.modules"
  android:value="com.some.CustomModule"/>

只是为了记录我还尝试在这样的Application类中指定它并且它不起作用:

RoboGuice.getorCreateBaseApplicationInjector(
                    this,RoboGuice.DEFAULT_STAGE,RoboGuice.newDefaultRoboModule(this),new CustomModule(this));

这是关于它的设置,我们没有改变任何东西,如果我使用Roboguice 2,一切正常.

我还尝试了其他一些事情:

>还尝试了没有Roboblender和注释db RoboGuice.setUseAnnotationDatabases(false);它没有任何区别.
> Ln.d(“Test”Strings.toString(0));这个日志打印得很好所以我认为实际的库是正确打包的.
>我尝试使用像RoboGuice.getInjector(this).getInstance(SharedPreferencesHelper.class)这样的手动注入,而不是注入POJO的Provider.它会抛出一些错误,无法在some.path.SharedPreferencesHelper中找到合适的构造函数.类必须有一个(也是唯一一个)使用@Inject注释的构造函数或一个非私有的零参数构造函数.奇怪的是,在SharedPreferencesHelper类中,我们有一个@Inject注释的公共构造函数,我想不知何故它没有被考虑在内?也许整个问题是由于没有考虑注释?

我已经对它进行了几天的撞击,并且非常感谢任何输入或更多的东西尝试.

最佳答案
将其添加到应用程序类将解决当前的问题.如果添加到默认启动活动,它也应该有效.

static {
    RoboGuice.setUseAnnotationDatabases(false);
}

AnnotationDatabaseImpl类由Roboblender在编译时生成.

获取注释数据库的工作原理:

编译器参数“guiceAnnotationDatabasePackageName”决定生成的AnnoationsDatabaseImpl类分配给哪个包.

对于maven构建:

figuration>
                    figuration>

然后在应用程序清单中,在application元素内添加一个引用生成的类的元数据标记.

<Meta-data android:name="roboguice.annotations.packages" android:value="some.package.name.here"/>

如果您进行了这些更改并使用了intellij,那么重新导入Maven pom将应用这些更改.或者,在Intellij中,您可以分配编译器参数以获取要创建的注释.

这将在Settings / Build,Executions,Deployment / Java Compiler中的Additional命令行参数下进行

-AguiceAnnotationDatabasePackageName = some.package.name.here

希望这会有所帮助并为您节省一些悲伤:)

关于Java静态变量变为nulljava中静态变量的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于android – 在onPageSelected()中访问时,片段成员变量变为null、FreeMarker调用Java静态方法以及静态变量的方法、java – 为什么我的ListView在片段中的方向更改后变为null?、java – 升级到Roboguice 3后,注入的对象变为null的相关知识,请在本站寻找。

本文标签: