6

メイン アクティビティにスレッドがネストされています。

public class MainActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_main);

    new Thread(new Runnable(){
        public void run() {
            int myInt = 1;
            // Code below works fine and shows me myInt
            TextView textView = (TextView) findViewById(R.id.text_view);
            textView.setText(myInt);
        }
    }).start();

    // Code below doesn't work at all
    TextView textView = (TextView) findViewById(R.id.text_view);
    textView.setText(myInt);

}

この構造が正しいかどうかはわかりません。スレッドの外部で認識および操作可能になるように、 myInt変数をに渡すにはどうすればよいですか?MainActivity

4

3 に答える 3

1

スレッドの外側(メインスレッド上)にあるテキストビューを設定する前に、すでに設定されている整数のグローバル変数が最初に必要になります。開始する新しいスレッドは単純に開始され、コードの次の行に移動するため、myInt はまだ設定されていないため、事前に設定する必要があります。

次に、少なくとも最初は、メイン スレッドの textview に所定のグローバル整数値を使用します。開始したスレッド内から変更したい場合は、スレッドから整数を渡し、グローバル変数をその値に設定する setIntValue() のようなメソッドをクラスに作成します。必要に応じて、後でコード例を更新できます。

更新: コード例

public class MainActivity extends Activity {

//your global int
int myInt

public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);

new Thread(new Runnable(){
    public void run() {
        int myRunnableInt = 1;
        // Code below works fine and shows me myInt
        TextView textView = (TextView) findViewById(R.id.text_view);
        textView.setText(String.valueOf(myRunnableInt));

        //say you modified myRunnableInt and want the global int to reflect that...
        setMyInt(myRunnableInt);
    }
}).start();

//go ahead and initialize the global one here because you can't directly access your
myRunnableInt
myInt = 1;

TextView textView = (TextView) findViewById(R.id.text_view);
textView.setText(String.valueOf(myInt)); //now you will have a value here to use

//method to set the global int value
private void setMyInt(int value){
    myInt = value;

    //you could also reset the textview here with the new value if you'd like
    TextView textView = (TextView) findViewById(R.id.text_view);
    textView.setText(String.valueOf(myInt));
}
}

注:グローバルで操作可能な変数を使用するのではなく、テキストビューのみをリセットできるようにしたい場合は、グローバル変数を保存するのではなく、新しい整数を渡してテキストビューを設定するようにメソッドを変更することをお勧めします。これ:

private void setTextView(int newInt){
    TextView textView = (TextView) findViewById(R.id.text_view);
    textView.setText(String.valueOf(newInt));
}

上記を行う場合は、スレッド内からメソッドを呼び出すときに、次のように UI スレッドで呼び出すようにしてください。

于 2012-09-12T14:06:15.627 に答える
0

変化する

public class MainActivity extends Activity {
    // create activity field/member
    private int myIntValue;
    public void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_main);

    runOnUiThread(new Runnable(){
        public void run() {
            myIntValue = 1;
            // Code below works fine and shows me myInt
            TextView textView = (TextView) findViewById(R.id.text_view);
            if (textView != null){
                textView.setText(myInt);
            }
        }
    });

    TextView textView = (TextView) findViewById(R.id.text_view);
    if (textView != null){
        textView.setText(myIntValue);
    }
}
于 2012-09-12T13:14:11.233 に答える
-2

次のことを試してください。

public class MainActivity extends Activity 
{
    TextView textView;

    public void onCreate(Bundle savedInstanceState)
    {
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text_view);
        new Thread(new Runnable()
        {
            public void run() 
            {
                int myInt = 1;
                textView.setText(myInt);
            }
        }).start();

    }
于 2012-09-12T13:14:38.340 に答える