我有类ScheduleTimer,它适用于日期数组。这是:
class ScheduleTimer {
public TextView textView;
private Timer dateTimer;
private Timer remainderTimer;
private Date formatDate = new Date();
private Date nextDate;
private boolean remainderTimerStarted;
private static final long REMINDER_UPDATE_INTERVAL = 1000;
private static String[] DATES;
private int currentIndex;
public ScheduleTimer(final TextView t) {
textView = t;
dateTimer = new Timer();
}
public void main(String[] dates) throws ParseException {
checkDates(dates);
run();
}
private void checkDates(String[] dates) throws ParseException {
List<String> list = new ArrayList<>();
DateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm", Locale.ENGLISH);
for(String date : dates) {
long current = System.currentTimeMillis() + 1000;
if(format.parse(date).getTime() - current > 0) {
list.add(date);
}
}
DATES = new String[list.size()];
list.toArray(DATES);
}
private void run() {
nextDate = parseDate(DATES[currentIndex]);
schedule();
}
public void schedule() {
runSecondsCounter();
dateTimer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("Current date is:" + new Date());
currentIndex++;
if (currentIndex < DATES.length) {
nextDate = parseDate(DATES[currentIndex]);
System.out.println("Next date is:" + nextDate);
schedule();
} else {
remainderTimer.cancel();
}
}
}, nextDate);
}
private Date parseDate(String nextDate) {
Date date = null;
DateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm",
Locale.ENGLISH);
try {
date = format.parse(nextDate);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
private void runSecondsCounter() {
if (remainderTimerStarted) {
remainderTimer.cancel();
}
remainderTimer = new Timer();
remainderTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
remainderTimerStarted = true;
long remains = nextDate.getTime() - new Date().getTime();
System.out.println("Remains: " + (remains / 1000) + " seconds");
formatDate.setTime(remains);
textView.setText(formatDate.toString());
}
}, REMINDER_UPDATE_INTERVAL, REMINDER_UPDATE_INTERVAL);
}
}
如果我像Java应用程序一样运行它,而不是android,它可以正常工作,并且它会在控制台中打印出每个计数秒。但是当它在android环境中运行它时,它要么说不能从任何其他线程触及UI线程,要么它在类{{1}的方法NullPointerException
中给我run()
}}。
我这样使用它:ScheduleTimer
我尝试使用new ScheduleTimer(textView).main(new String[] {"13.04.2015 13:59", "13.04.2015 14:14", "13.04.2015 14:15"});
或AsyncTask
,但可能,我做得不对。
无论如何,我需要找到使用这个类以某种方式更新我的Handler
的方法。
有人可以帮我吗?如何在我的TextView
方法中正常运行并正确传递所需的onCreateView
?
答案 0 :(得分:3)
runOnUiThread()
方法会将您的Runnable
发送到主线程上。在run()
中,您可以操作UI控件:
@Override
public void run() {
remainderTimerStarted = true;
long remains = nextDate.getTime() - new Date().getTime();
formatDate.setTime(remains);
runOnUiThread(new Runnable() { // <= here!
@Override
public void run() {
textView.setText(formatDate.toString());
}
});
}
Check this了解更多信息。
答案 1 :(得分:2)
AsyncTask的骨架将是:
public class ListLoader extends AsyncTask<Void, Void, String> {
ProgressDialog Asycdialog = new ProgressDialog(CreateGroup.this);
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
System.out.println("Pre Execute");
Asycdialog.setMessage("Working");
Asycdialog.getWindow().setGravity(Gravity.CENTER_VERTICAL);
Asycdialog.getWindow().setGravity(Gravity.CENTER_HORIZONTAL);
Asycdialog.setCancelable(false);
Asycdialog.show();
super.onPreExecute();
}
protected void onPostExecute(String result) {
Asycdialog.cancel();
//Play with result here - Update UI
}
@Override
protected String doInBackground(Context... params) {
//Memory intense or long running operation here
publishProgress(progress); //Publish your progress - update a textView
return "result will be sent to onPostExecute()";
}
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
Asycdialog.setMessage("" + values[0]);
}
}
答案 2 :(得分:2)
完整的答案是: 你的片段:
public class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
TextView textView = (TextView) rootView.findViewById(R.id.tv);
try {
new ScheduleTimer(textView, getActivity())
.main(new String[] {"13.04.2015 13:59", "13.04.2015 14:14", "13.04.2015 14:15"});
} catch (ParseException e) {
e.printStackTrace();
}
return rootView;
}
}
您的ScheduleTimer课程:
class ScheduleTimer {
public TextView textView;
private Timer dateTimer;
private Timer remainderTimer;
private Date formatDate = new Date();
private Date nextDate;
private boolean remainderTimerStarted;
private static final long REMINDER_UPDATE_INTERVAL = 1000;
private static String[] DATES;
private int currentIndex;
private Activity activity;
public ScheduleTimer(final TextView t, Activity a) {
textView = t;
activity = a;
dateTimer = new Timer();
}
public void main(String[] dates) throws ParseException {
checkDates(dates);
run();
}
private void checkDates(String[] dates) throws ParseException {
List<String> list = new ArrayList<>();
DateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm", Locale.ENGLISH);
for(String date : dates) {
long current = System.currentTimeMillis() + 1000;
if(format.parse(date).getTime() - current > 0) {
list.add(date);
}
}
DATES = new String[list.size()];
list.toArray(DATES);
}
private void run() {
nextDate = parseDate(DATES[currentIndex]);
schedule();
}
public void schedule() {
runSecondsCounter();
dateTimer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("Current date is:" + new Date());
currentIndex++;
if (currentIndex < DATES.length) {
nextDate = parseDate(DATES[currentIndex]);
System.out.println("Next date is:" + nextDate);
schedule();
} else {
remainderTimer.cancel();
}
}
}, nextDate);
}
private Date parseDate(String nextDate) {
Date date = null;
DateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm",
Locale.ENGLISH);
try {
date = format.parse(nextDate);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
private void runSecondsCounter() {
if (remainderTimerStarted) {
remainderTimer.cancel();
}
remainderTimer = new Timer();
remainderTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
remainderTimerStarted = true;
long remains = nextDate.getTime() - new Date().getTime();
System.out.println("Remains: " + (remains / 1000) + " seconds");
formatDate.setTime(remains);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(formatDate.toString());
}
});
}
}, REMINDER_UPDATE_INTERVAL, REMINDER_UPDATE_INTERVAL);
}
}