Java 如何将数据从线程获取到另一个类

Java 如何将数据从线程获取到另一个类,java,android,Java,Android,帮助从main activity中的线程t获取数据(tdate) btn_in = (Button) findViewById(R.id.btn_insert); btn_in.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { registerUser(); } });

帮助从
main activity
中的线程
t
获取数据(tdate)

    btn_in = (Button) findViewById(R.id.btn_insert);
    btn_in.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            registerUser();
        }
    });

    Thread t = new Thread() {
        @Override
        public void run() {
            try {
                while (!isInterrupted()) {
                    Thread.sleep(1000);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            TextView tdate = (TextView) findViewById(R.id.date);
                            long date = System.currentTimeMillis();
                            SimpleDateFormat sdf = new SimpleDateFormat("MMM dd yyyy\nhh-mm-ss a");
                            String dateString = sdf.format(date);
                            tdate.setText(dateString);
                        }
                    });
                }
            } catch (InterruptedException e) {
            }
        }
    };
    t.start();
}
到类注册服务器…(tdate)

我不熟悉android和java

有人帮我学习吗

private void registerUser() {
    String datetime = tdate.getText().toString().trim().toLowerCase();
    register(datetime);
}

如果线程位于其他Java类中,则可以创建一个新接口,如:

public interface OnTimeReceived {
    void onTimeReceived(String time);
}
在MainActivity上,将实现添加到此侦听器,实现该方法,然后在回调中将文本设置为textView

然后在线程上调用“mListener.ontimereved(dateString)”来更新视图

例:


创建thread类时,从构造函数中的活动中为侦听器赋值。

如果我理解正确,只需使用适当的参数调用函数本身即可:

public void run() {
    tdate = (TextView) findViewById(R.id.date);
    date = System.currentTimeMillis();
    sdf = new SimpleDateFormat("MMM dd yyyy\nhh-mm-ss a");
    dateString = sdf.format(date);
    tdate.setText(dateString);
    registerUser(datetime); // <- Why can't you just do this?
}
另一种选择是创建一个类,该类接收数据并具有对主活动的引用。当您完成线程时,调用其中的函数,它的工作就是简单地调用主活动上的函数。可以说,这是一个“接受者”类

此外,你应该避免使用睡眠(1000)。 改用这个:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // Do something after 1000 ms
    }
}, 1000); // specify the waiting time here
它干净多了。
让我知道结果如何。

要完成其他答案,您可以尝试:

TextView tdate;

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

    tdate = (TextView)findViewById(R.id.date);
    btn_in = (Button) findViewById(R.id.btn_insert);
    btn_in.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            registerUser();
        }
    });
    createThread();
}

private void createThread(){
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            run();
        }
    },1000);
}

private void run(){
    long date = System.currentTimeMillis();
    SimpleDateFormat sdf = new SimpleDateFormat("MMM dd yyyy\nhh-mm-ss a");
    String dateString = sdf.format(date);
    tdate.setText(dateString);
}

请提供更多关于您到底想做什么的信息。我个人更喜欢编写我自己类型的
EventListener
,或者您可以看看,另外我无法从类注册表的线程中获取值tdate
TextView tdate=(TextView)findViewById(R.id.date)线程外部。tdate仅在threadok中有作用域谢谢。。。但在这里,我从线程中获取日期和时间。。。我希望在tdate中输出…正如aditya所说,在活动顶部声明textView,如
公共类活动。。。文本视图tdate在onCreate方法中执行findView:
tdate=(TextView)findViewById(R.id.date)tdate.setText(dateString)
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // Do something after 1000 ms
    }
}, 1000); // specify the waiting time here
TextView tdate;

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

    tdate = (TextView)findViewById(R.id.date);
    btn_in = (Button) findViewById(R.id.btn_insert);
    btn_in.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            registerUser();
        }
    });
    createThread();
}

private void createThread(){
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            run();
        }
    },1000);
}

private void run(){
    long date = System.currentTimeMillis();
    SimpleDateFormat sdf = new SimpleDateFormat("MMM dd yyyy\nhh-mm-ss a");
    String dateString = sdf.format(date);
    tdate.setText(dateString);
}