静态关键字,需要重新安装

时间:2012-06-09 12:06:20

标签: android android-install-apk

在我的应用程序中,我有一个活动“模型”,其中我从编辑文本中获取值'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 扭曲在哪里?

1 个答案:

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