0

ユーザーが文字列と数値を入力するAndroidアプリを作成しました。数値は、階乗に基づいて計算されます。すべてが正常に機能していますが、コードをスレッド内に含めると出力がありません。

これが私のソースコードです:

package com.inputandfactorial;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    Button chkCmd;
    EditText input1, input2;
    TextView display1, display2;
    int res = 1,factint;
    String fact;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        chkCmd = (Button) findViewById(R.id.bProcess);
        input1 = (EditText) findViewById(R.id.etString);
        input2 = (EditText) findViewById(R.id.etFactorial);
        display1 = (TextView) findViewById(R.id.tvString);
        display2 = (TextView) findViewById(R.id.tvFactorial);

        chkCmd.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {



                Thread t1 = new Thread(){
                    public void run(){
                        String change = input1.getText().toString();
                        fact = input2.getText().toString();
                        factint = Integer.parseInt(fact);
                        for (int i = 1; i <= factint; i++) {
                            res = res * i;
                        }
                        try {
                            display2.setText("The factorial of " + fact + " is " + res);
                            display1.setText("The string value is " + change);
                        } catch (Exception e) {

                        }
                    }
                };
                t1.start();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

私はそれをスレッドに入れる必要がないことを知っています、私はこれがうまくいくかどうかを確かめるためにただ実験しただけで、うまくいきませんでした。

4

4 に答える 4

0

ViewUIスレッドでのみsを操作できます。コードをでラップRunnableし、メインスレッドで次のように実行しますActivity#runOnUiThread(Runnable action)

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        display2.setText("The factorial of " + fact + " is " + res);
        display1.setText("The string value is " + change);
    }
}

とは言うものの、単純な算術はそもそもaの使用を保証するものではありませんThread...

于 2012-08-01T15:04:02.407 に答える
0

私はあなたがスレッドを必要としないという上記のコメントに同意しますが、あなたの質問に答えるために...

AsyncTasksを確認する必要があります。実用的な例AsyncTaskAndroidの例を提供する必要がある以前の回答を書きました

さらに、元のGUIスレッドからのUIにのみ影響を与えることができるため、上記のコードは機能しないことを説明します。

于 2012-08-01T15:01:15.600 に答える
0

スレッドからUIを変更することはできません。UIのすべての変更は、UIThreadで行う必要があります。これを簡単に行うには、AsyncTaskを使用します。

http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-08-01T15:00:12.527 に答える
0

1. UI スレッドで UI 作業を維持し、非 UI スレッドで非 UI 作業を維持することは常に良い習慣です。Android版のリリースでそれが法律になりました。HoneyComb

2. Androidアプリケーションは UI スレッドで開始されます。他のスレッドを作成すると、 Androidスレッドから脱落し、このスレッドは非 UI スレッドになります。

3.スレッドの作業Non-UIスレッドに戻すには、次の2 つの方法UIを使用する必要があります。

- ThreadとともにHandler

- UI スレッドと非 UI スレッドを同期するためAsyncTaskに Android に特別に導入された.Painless threading

于 2012-08-01T16:50:10.243 に答える