0

私のアプリケーションでは、編集テキストから値'n'を取得するActivity"Model"があり、この値nをstaticintとして宣言しています。つまり、アプリケーションの任意のクラス内でアクセスできるようになります。

問題は、アプリケーションを再インストールせずに再起動すると、「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の値; 2回目にアプリをインストールせずに実行した場合、編集テキストに3を入力しても、nの値は2のままです。ねじれはどこにありますか?

4

1 に答える 1

2

クマール、

表示されている動作は、staticメンバーを使用した結果です。staticメンバーはインスタンスを必要としないため、(インスタンスが作成されたかどうかに関係なく)最初のアクセス時に設定され、Androidがインスタンスが無効であると判断するまでメモリに残ります。本質的に、それはそれが想定されていたことを正確に実行しています。静的変数の適切な使用は、ベテランプログラマーと初心者プログラマーの間で同様に広範な議論のトピックですが、本質的には常に「静的メンバーをどこでどのように使用するかを選択する」ことにつながります。

とはいえ、別のコンポーネントからこれにアクセスする必要があることは一般的な問題ですが、それを解決する方法はいくつかあります。各インスタンスに異なる値を設定する必要がある場合は、静的であってはなりません。代わりに、アクティビティのインスタンスを渡す方法を見つける必要があります。

各インスタンスが異なる必要はないが、他のパラメータに従って値を変更する必要がある場合は、値を変更する適切な場所を見つけるだけです。アプリケーションのどこからでもアクセスできる場合は、アプリケーションのどこからでも変更できます。

解決策1:意図による通過

このソリューションは、情報が変更される可能性があり、別のコンポーネントおよびそれが排他的に使用するクラスに送信する必要がある場合に役立ちます。インテントエクストラを介して、事実上すべての値を渡すことができます。

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

これは(せいぜい)信頼性が低く、正しく管理されていないと大量のメモリリークを引き起こす可能性があります。

お役に立てれば、

FuzzicalLogic

于 2012-06-09T12:24:13.993 に答える