在我的应用程序中,我有一个活动“模型”,其中我从编辑文本中获取值'n',我已将此值n声明为静态int。所以,我可以在应用程序的任何类中访问它。
问题在于,当我重新启动应用程序而不重新安装它时,'n'的值仍然与第一种情况相同。这会影响我的输出。
我不能使用intent来发送值,因为即使在非活动的类中,也会在应用程序中随机访问该值。
你能告诉我,我错了吗?
package com.integrated.mpr;
import java.io.File;
import android.app.Activity;
import android.app.Dialog;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Model extends Activity implements OnClickListener{
EditText etPos;
Button bmodel;
static int n;//static variable to be used in other classes
File folder ;
File subfolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.inputpage);
etPos = (EditText) findViewById(R.id.etpos);
bmodel = (Button) findViewById(R.id.bModel);
bmodel.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.bModel:
String check = etPos.getText().toString();
String check1 = etNs.getText().toString();
n = Integer.parseInt(check);
Intent openAlternative = new Intent("com.integrated.mpr.ALTERNATIVE");
startActivity(openAlternative);
break;
}
}
}
如果我首先安装我的应用程序,并在edittext中输入值为2,则值n = 2;如果第二次运行我的应用程序而不安装它,即使我在edittext中输入3,n的值仍为2 扭曲在哪里?
答案 0 :(得分:2)
库马尔
您看到的行为是使用static
成员的结果。 static
成员不需要实例,因此在首次访问时设置(无论是否创建实例)并保留在内存中,直到Android确定它不再有效。从本质上讲,它正在完全按照预期行事。正确使用静态变量是老手和新手程序员之间广泛讨论的话题,但基本上总是导致“选择使用静态成员的位置和方式”。
也就是说,您需要从另一个组件访问它是一个常见问题,并且有很多方法可以解决它。如果您需要让每个实例具有不同的值,那么它不应该是静态的。相反,您必须找到一种方法来传递Activity的实例。
如果每个实例不需要不同,但是值需要根据其他一些参数进行更改,只需找到适当的位置来更改该值。如果您可以从应用程序的任何位置访问它,您也可以从应用程序的任何位置进行更改。
解决方案1:按意图传递
当信息可能发生变化时,此解决方案非常有用,必须将其发送到另一个组件及其使用的类。您可以通过Intent extra传递几乎任何值。
openAlternative.putExtra("MyValue", Integer.parseInt(check));
在您的回复组件中,您可以通过以下方式检索值:
Intent myIntent = getIntent();
int n = myIntent.getIntExtra("MyValue", 0); //0 is the default if no value is sent.
从这里,您可以轻松地将检索到的值传递给该组件使用的任何类。一个例子:
MyClass.setN(n);
解决方案2:存储在LifeCycle之外
更安全的替代方法是将值移动到扩展的应用程序。这不受UI或LifeCycle处理的影响。
public class MyApplication extends Application
{
static int n;
}
调整AndroidManifest.xml ...
<application android:name=".MyApplication" ... >
<!-- All of your components -->
</application>
现在,您可以这样设置变量:
MyApplication.n = Integer.parseInt();
你可以通过
获得它int myN = MyApplication.n;
这个解决方案让我度过了许多困难的一天。但是,它应该真正用于非实例相关数据。
解决方案3:真正的UNSAFE方法
此解决方案仅在您可以保证组件的单个实例时才有效。这需要设置singleTask。 非常小心这个
将n更改为非静态
int n;
将活动更改为Singleton
static private Model myInstance;
在OnCreate中,设置myInstance
myInstance = this;
创建一个getter:
static public Model getStaticInstance()
{
return myInstance;
}
这是不可靠的(充其量),如果管理不正确,可能会导致巨大的内存泄漏。
希望这有帮助,
FuzzicalLogic