gpt4 book ai didi

Android - 希望应用每秒执行一次任务

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:57 25 4
gpt4 key购买 nike

我试图让我的倒计时应用程序执行其更新我当前时间和日期 TextView 的功能,并每秒触发其 MyOnItemSelectedListener,以便该应用程序动态倒计时,而不是仅在启动 onCreate 时倒计时。如果有更有效的方法然后快速触发 MyOnItemSelectedListener 我将不胜感激批评。

public class TheCount extends Activity {
TextView description=null;
TextView dates=null;
TextView times=null;
TextView output=null;
TextView cDateDisplay=null;
TextView cTimeDisplay=null;
private int mYear;
private int mMonth;
private int mDay;
private int mHour;
private int mMinute;
private int mSecond;
CountdownHelper helper=null;
String countdownId=null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.thecount);
helper=new CountdownHelper(this);
cTimeDisplay = (TextView)findViewById(R.id.lblCurTime);
cDateDisplay = (TextView)findViewById(R.id.lblCurDate);

final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
mSecond = c.get(Calendar.SECOND);

Spinner spinner = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.countoptions, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

description =(TextView)findViewById(R.id.lblDescriptFed);
dates =(TextView)findViewById(R.id.lblDateFed);
times =(TextView)findViewById(R.id.lblTimeFed);
output =(TextView)findViewById(R.id.lblOutput);

countdownId=getIntent().getStringExtra(MainActivity.ID_EXTRA);
if (countdownId!=null) {
load();
}

spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());

updateDisplay();

}

private void updateDisplay() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
//@Override
public void run() {
updatedDisplay();
}
},0,1000);//Update text every second

}

public class MyOnItemSelectedListener implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {

if (parent.getItemAtPosition(pos).toString().equals("Normal")){
Toast.makeText(parent.getContext(), "Countdown format is " +
parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
convertTime();
} else if (parent.getItemAtPosition(pos).toString().equals("by Days")){
Toast.makeText(parent.getContext(), "Countdown format " +
parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
convertDays();
} else if (parent.getItemAtPosition(pos).toString().equals("by Hours")){
Toast.makeText(parent.getContext(), "Countdown format " +
parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
convertHours();
} else if (parent.getItemAtPosition(pos).toString().equals("by Minutes")){
Toast.makeText(parent.getContext(), "Countdown format " +
parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
convertMinutes();
} else if (parent.getItemAtPosition(pos).toString().equals("by Seconds")){
Toast.makeText(parent.getContext(), "Countdown format " +
parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
convertSeconds();
}

}
public void onNothingSelected(AdapterView parent) {
// Do nothing.
}
}

private void convertTime() {
String dtCountdown = dates.getText().toString() + " " + times.getText().toString();
String dtCurrent = cDateDisplay.getText().toString() + " " + cTimeDisplay.getText().toString();
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
try {
Date date = format.parse(dtCountdown);
Date dateCur = format.parse(dtCurrent);
long diff = dateCur.getTime() - date.getTime();

int timeInSeconds = (int) (diff / 1000);
int days, hours, minutes, seconds;
days = timeInSeconds / 86400;
timeInSeconds = timeInSeconds - (days * 86400);
hours = timeInSeconds / 3600;
timeInSeconds = timeInSeconds - (hours * 3600);
minutes = timeInSeconds / 60;
timeInSeconds = timeInSeconds - (minutes * 60);
seconds = timeInSeconds;


System.out.println(date);
if(dateCur.compareTo(date)>0){
output.setText(String.valueOf(days) + " days " + String.valueOf(hours) +
" hours \n" + String.valueOf(minutes) + " minutes " + String.valueOf(seconds) + " seconds ago");
} else {
output.setText(String.valueOf(Math.abs(days)) + " days " + String.valueOf(Math.abs(hours)) +
" hours \n" + String.valueOf(Math.abs(minutes)) + " minutes " + String.valueOf(Math.abs(seconds)) + " seconds till");
}

} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private void convertDays() {
String dtCountdown = dates.getText().toString() + " " + times.getText().toString();
String dtCurrent = cDateDisplay.getText().toString() + " " + cTimeDisplay.getText().toString();
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm");
try {
Date date = format.parse(dtCountdown);
Date dateCur = format.parse(dtCurrent);
long diff = dateCur.getTime() - date.getTime();

int timeInSeconds = (int) (diff / 1000);
int days;
days = timeInSeconds / 86400;

System.out.println(date);
if(dateCur.compareTo(date)>0){
output.setText(String.valueOf(days) + " days ago");
} else {
output.setText(String.valueOf(Math.abs(days)) + " days till");
}

} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private void convertHours() {
String dtCountdown = dates.getText().toString() + " " + times.getText().toString();
String dtCurrent = cDateDisplay.getText().toString() + " " + cTimeDisplay.getText().toString();
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm");
try {
Date date = format.parse(dtCountdown);
Date dateCur = format.parse(dtCurrent);
long diff = dateCur.getTime() - date.getTime();

int timeInSeconds = (int) (diff / 1000);
int hours;

hours = timeInSeconds / 3600;

System.out.println(date);
if(dateCur.compareTo(date)>0){
output.setText(String.valueOf(hours) + " hours ago");
} else {
output.setText(String.valueOf(Math.abs(hours)) + " hours till");
}

} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private void convertMinutes() {
String dtCountdown = dates.getText().toString() + " " + times.getText().toString();
String dtCurrent = cDateDisplay.getText().toString() + " " + cTimeDisplay.getText().toString();
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm");
try {
Date date = format.parse(dtCountdown);
Date dateCur = format.parse(dtCurrent);
long diff = dateCur.getTime() - date.getTime();

int timeInSeconds = (int) (diff / 1000);
int minutes;

minutes = timeInSeconds / 60;

System.out.println(date);
if(dateCur.compareTo(date)>0){
output.setText(String.valueOf(minutes) + " minutes ago");
} else {
output.setText(String.valueOf(Math.abs(minutes)) + " minutes till");
}

} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private void convertSeconds() {
String dtCountdown = dates.getText().toString() + " " + times.getText().toString();
String dtCurrent = cDateDisplay.getText().toString() + " " + cTimeDisplay.getText().toString();
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm");
try {
Date date = format.parse(dtCountdown);
Date dateCur = format.parse(dtCurrent);
long diff = dateCur.getTime() - date.getTime();

int timeInSeconds = (int) (diff / 1000);
int seconds;
seconds = timeInSeconds;

System.out.println(date);
if(dateCur.compareTo(date)>0){
output.setText(String.valueOf(seconds) + " seconds ago");
} else {
output.setText(String.valueOf(Math.abs(seconds)) + " seconds till");
}

} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private void updatedDisplay() {
TextView cDateDisplay=null;
TextView cTimeDisplay=null;
cTimeDisplay = (TextView)findViewById(R.id.lblCurTime);
cDateDisplay = (TextView)findViewById(R.id.lblCurDate);
cDateDisplay.setText(
new StringBuilder()
// Month is 0 based so add 1
.append(mDay).append("/")
.append(mMonth + 1).append("/")
.append(mYear).append(" "));
cTimeDisplay.setText(
new StringBuilder()
.append(pad(mHour)).append(":")
.append(pad(mMinute)).append(":").append(pad(mSecond)));
}

private static String pad(int c) {
if (c >= 10)
return String.valueOf(c);
else
return "0" + String.valueOf(c);
}

private void load() {
Cursor c=helper.getById(countdownId);

c.moveToFirst();
description.setText(helper.getDescription(c));
dates.setText(helper.getDate(c));
times.setText(helper.getTime(c) + ":00");

c.close();
}

@Override
public void onDestroy() {
super.onDestroy();

helper.close();
}

@NamLe:这会使应用程序崩溃,并在调用 onCreate() 时将其显示在 LogCat 中。

02-23 13:19:43.540: I/System.out(11667): Sun Jun 24 00:00:00 MDT 2012
02-23 13:19:44.500: W/dalvikvm(11667): threadid=11: 线程以未捕获的异常退出 (group=0x40a351f8)
02-23 13:19:44.510: E/AndroidRuntime(11667): 致命异常: Timer-0
02-23 13:19:44.510: E/AndroidRuntime(11667): android.view.ViewRootImpl$CalledFromWrongThreadException: 只有创建 View 层次结构的原始线程才能触及它的 View 。
02-23 13:19:44.510: E/AndroidRuntime (11667): 在 android.view.ViewRootImpl.checkThread (ViewRootImpl.java:4039)
02-23 13:19:44.510: E/AndroidRuntime (11667): 在 android.view.ViewRootImpl.requestLayout (ViewRootImpl.java:709)
02-23 13:19:44.510: E/AndroidRuntime(11667): 在 android.view.View.requestLayout(View.java:12675)
02-23 13:19:44.510: E/AndroidRuntime(11667): 在 android.view.View.requestLayout(View.java:12675)
02-23 13:19:44.510: E/AndroidRuntime(11667): 在 android.view.View.requestLayout(View.java:12675)
02-23 13:19:44.510: E/AndroidRuntime(11667): 在 android.view.View.requestLayout(View.java:12675)
02-23 13:19:44.510: E/AndroidRuntime(11667): 在 android.view.View.requestLayout(View.java:12675)
02-23 13:19:44.510: E/AndroidRuntime(11667): 在 android.widget.TextView.checkForRelayout(TextView.java:6773)
02-23 13:19:44.510: E/AndroidRuntime(11667): 在 android.widget.TextView.setText(TextView.java:3306)
02-23 13:19:44.510: E/AndroidRuntime(11667): 在 android.widget.TextView.setText(TextView.java:3162)
02-23 13:19:44.510: E/AndroidRuntime(11667): 在 android.widget.TextView.setText(TextView.java:3137)
02-23 13:19:44.510: E/AndroidRuntime(11667): 在 com.pixelcrunch.crunchtime.TheCount$1.run(TheCount.java:87)
02-23 13:19:44.510: E/AndroidRuntime(11667): 在 java.util.Timer$TimerImpl.run(Timer.java:284)

最佳答案

尝试使用 UpdateDisplay 函数,如下所示:

private void updateDisplay() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {

@Override
public void run() {
Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
mSecond = c.get(Calendar.SECOND);

cDateDisplay.setText(new StringBuilder()
// Month is 0 based so add 1
.append(mDay).append("/")
.append(mMonth + 1).append("/")
.append(mYear).append(" "));

cTimeDisplay.setText(
new StringBuilder()
.append(pad(mHour)).append(":")
.append(pad(mMinute)).append(":").append(pad(mSecond))
);
}

},0,1000);//Update text every second
}

最后,您必须在onCreate() 函数中调用updateDisplay()
我希望这段代码能帮助你完成你想要的!

关于Android - 希望应用每秒执行一次任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9406523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com