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为什么你不能使用处理器?我没有使用处理程序处理这类代码的经验。请查看帖子的部分内容。可能是你错了,也可能是我做错了什么。