在本文中,您将会了解到关于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中静态变量)
- android – 在onPageSelected()中访问时,片段成员变量变为null
- FreeMarker调用Java静态方法以及静态变量的方法
- java – 为什么我的ListView在片段中的方向更改后变为null?
- java – 升级到Roboguice 3后,注入的对象变为null
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
我正在使用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];
}
}
看到这个答案:https://stackoverflow.com/a/23843743/1271907
您必须保留对实际片段的引用.
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?
在我的一个片段中,我有一个从父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
我刚刚升级了我们的项目以使用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静态变量变为null和java中静态变量的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于android – 在onPageSelected()中访问时,片段成员变量变为null、FreeMarker调用Java静态方法以及静态变量的方法、java – 为什么我的ListView在片段中的方向更改后变为null?、java – 升级到Roboguice 3后,注入的对象变为null的相关知识,请在本站寻找。
本文标签: