Android TextView仅显示最后一条消息

时间:2020-09-05 15:08:02

标签: android multithreading textview

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "Main";
    private Handler mainHandler = new Handler();
    public static Context cont;
    private long BPressedTime;
    public static Toast Toaster;
    private EditText EditText1, EditText2;
    private TextView Head;
    private Button Login;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EditText1 = (EditText)findViewById(R.id.EditText1);
        EditText2 = (EditText)findViewById(R.id.EditText2);
        Head = (TextView)findViewById(R.id.Head);
        Login = (Button)findViewById(R.id.Login);
        cont = getApplicationContext();
        Login.setOnClickListener(new ViewListeners(EditText1, EditText2, Head, Login, getApplicationContext(), Toaster));
    }

    public void runonui(Runnable run){
        Thread thread = new Thread(run);
        runOnUiThread(thread);
    }

    public class ViewListeners extends FireBaseConsole implements View.OnClickListener{
        private static final String TAG = "View";
        private FireBaseConsole FireBase;
        private Thread thread;
        private long ErrorTime;
        private EditText E1, E2;
        private Button B1;
        private TextView T1;
        private Context cont;


        public ViewListeners(EditText E1, EditText E2, TextView T1, Button B1, Context cont, Toast Toaster){
            this.B1 = B1;
            this.E1 = E1;
            this.E2 = E2;
            this.T1 = T1;
            this.cont = cont;
        }


        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.Login:
                    String usr, psw, send;
                    usr = this.E1.getText().toString();
                    psw = this.E2.getText().toString();
                    if(!usr.equals("") && !psw.equals("") && usr != null && psw != null){
                        send = usr + " " + psw;
                        Runnable run = new GenRun<TextView>(this.T1, (Object)send);
                        runonui(run);//Starting the thread

                    }else if(this.cont != null){
                        if(ErrorTime + 1000 < System.currentTimeMillis()){
                            MainActivity.TToast("Incorrect email or password.");
                        }
                        ErrorTime = System.currentTimeMillis();
                    }
                    break;

                default:
                    break;
            }
        }
    }

    public class GenRun <T> implements Runnable {

        private final static String TAG = "GenRun";
        private T obj;
        private Object extra;
        public boolean isAlive;


        public GenRun(T obj, Object ex){
            this.obj = obj;
            this.extra = ex;
            isAlive = true;
        }

        @Override
        public void run(){
            if(this.obj instanceof View)
                if(this.obj instanceof TextView) {
                    try {//Here is the problem, it only shows the text ="2"
                        for (int i = 0; i < 3; i++) {
                            ((TextView)this.obj).setText(" " + i);
                            Thread.sleep(1000);
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
           
                }

        }

       
    }

}

代码就像一个登录活动。 如果单击该按钮,并且密码和用户名已填满,则应该启动一个线程以更改TextView。为了进行测试,我尝试使用for循环更改它,并在每次迭代之间使用睡眠将i = 0更改为i = 2。我不知道为什么它不起作用。

问题: 它只打印“ 2”

想要的输出: 打印:“ 0”,“ 1”,“ 2”,两者之间有第二个区别。

0 个答案:

没有答案