Java TimerTask是否在新线程中执行 < P> >我可以认为在运行> /Code >中的代码将在新线程中执行,或者我必须使用 AycCastase < /P> Timer myTimer = new Timer(); // Создаем таймер final Handler uiHandler = new Handler(); myTimer.schedule(new TimerTask() { // Определяем задачу @Override public void run() { uiHandler.post(new Runnable() { @Override public void run() { } }); } ; }, 0L, 10L * 1000); // интервал - 10000 миллисекунд, 0 миллисекунд до первого запуска.
已更新 我在这段代码中得到一个错误:Java TimerTask是否在新线程中执行 < P> >我可以认为在运行> /Code >中的代码将在新线程中执行,或者我必须使用 AycCastase < /P> Timer myTimer = new Timer(); // Создаем таймер final Handler uiHandler = new Handler(); myTimer.schedule(new TimerTask() { // Определяем задачу @Override public void run() { uiHandler.post(new Runnable() { @Override public void run() { } }); } ; }, 0L, 10L * 1000); // интервал - 10000 миллисекунд, 0 миллисекунд до первого запуска.,java,android,multithreading,timertask,Java,Android,Multithreading,Timertask,已更新 我在这段代码中得到一个错误: Timer myTimer = new Timer(); final Handler uiHandler = new Handler(); myTimer.schedule(new TimerTask() { @Override public void run() { while (songRefreshing) {
Timer myTimer = new Timer();
final Handler uiHandler = new Handler();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
while (songRefreshing) {
uiHandler.post(new Runnable() {
@Override
public void run() {
try {
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = null;
response = httpclient.execute(new HttpGet(Const.php_url));
StatusLine statusLine = response.getStatusLine();
if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
response.getEntity().writeTo(out);
out.close();
String responseString = out.toString();
if (app.getCurSong() == null || app.getCurSong().intern() != responseString.intern()) {
app.setCurSong(responseString);
song_name.setText(app.getCurSong());
Log.d(LOG_TAG, "refreshCurSung - " + responseString);
}
} else {
response.getEntity().getContent().close();
throw new IOException(statusLine.getReasonPhrase());
}
} catch (IOException e) {
e.printStackTrace();
Log.d(LOG_TAG, e.toString());
}
}
});
}
}
;
}, 0L, 10L * 1000); // 10s interval
错误:
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1178)
at java.net.InetAddress.lookupHostByName(InetAddress.java:394)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:245)
at java.net.InetAddress.getAllByName(InetAddress.java:220)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:590)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:510)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:488)
这是否意味着TimerTask不会在新线程中执行?要直接回答您的问题,请引用以下内容: 课程概述 计时器安排一次性或重复执行的任务。更喜欢 新代码的ScheduledThreadPoolExecutor 每个计时器都有一个线程,在该线程上按顺序执行任务。 当此线程正忙于运行任务时,可运行的任务可能会受到影响 拖延 计划在绝对时间或在相对时间之后进行一次放炮 耽搁 定期任务计划为固定时间段或固定时间段 费率: 使用默认的固定周期执行,任务的每次连续运行 是相对于上一次运行的开始时间安排的,因此 在指定的时间范围内,运行之间的距离永远不会更近 时期对于固定速率执行,每次连续执行的开始时间 计划任务的运行时,不考虑上次运行的时间 发生了。这可能会导致一系列的聚集运行(一次 如果延迟阻止计时器运行,则立即启动 按时开始任务。当不再需要计时器时,用户应该 调用cancel(),释放计时器的线程和其他资源。 未明确取消的计时器可能会无限期地保留资源 该类不提供有关数据的实时性的保证 任务调度。多个线程可以共享一个计时器,而无需 同步 是的,这是一条线 更新(问题更新后): 当前的实现可能包含很多缺陷,这就是为什么我建议您将
Runnable
中的代码放在AsyncTask
中(并将所有代码放在doInBackground
方法中)。在那里你可以很容易地控制它
此外,我认为@重写run()
两次可能会导致死锁或其他情况。由于TimerTask
实际上是一个线程,因此我认为它内部不需要单独的Runnable
首先删除Runnable
的实现,然后尝试在HttpClient
内部启动TimerTask
(不带Runnable
)。如果您无法做到这一点,那么将代码(按照建议)放在异步任务中(无论如何,您将得到这样一个更漂亮的实现)
Thx你想做什么?如果你要发布到处理程序,为什么要使用计时器呢?(还有,你说的是哪一次运行?)你可以使用handler而不是timer,我需要每10秒执行一次操作。这就是为什么我使用定时器。@p.Valery为什么你不能使用处理器?我没有使用处理程序处理这类代码的经验。请查看帖子的部分内容。可能是你错了,也可能是我做错了什么。