0

在我的应用程序中,我有一个活动“模型”,在其中我从编辑文本中获取了一个值“n”,我已将此值 n 声明为静态 int。所以,我可以在应用程序的任何类中访问它。

问题是当我重新启动我的应用程序而不重新安装它时,'n' 的值仍然与第一种情况相同。这会影响我的输出。

我不能使用意图来发送值,因为即使在非活动的类中,该值也会在应用程序中随机访问。

你能告诉我,我错在哪里吗??

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;
        }

    }
}

如果我首先安装我的应用程序,并在编辑文本中输入值 2 ,则 n =2 的值;如果我第二次运行我的应用程序而不安装它,即使我在编辑文本中输入 3,n 的值仍然是 2 扭曲在哪里?

4

1 回答 1

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:存储在生命周期之外

更安全的替代方法是将值移动到扩展应用程序。这不受 UI 或生命周期处理的影响。

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:真正不安全的方法

此解决方案仅在您可以保证组件的单个实例时才有效。这需要设置 singleTask。对此要非常小心

将 n 更改为非静态

int n;

将活动更改为单例

static private Model myInstance;

在 OnCreate 中,设置 myInstance

myInstance = this;

创建一个吸气剂:

static public Model getStaticInstance()
{   
    return myInstance;
}

这是不可靠的(充其量),如果管理不当,可能会导致巨大的内存泄漏。

希望这可以帮助,

模糊逻辑

于 2012-06-09T12:24:13.993 回答