在热化时重新启动线程

时间:2014-11-11 16:03:13

标签: java android multithreading

我正在开发一个Android应用程序,应该每隔3个secondes向服务器发送一次数据,并让用户开始或停止此过程, 所以我创建了一个这样的线程:

class updaterunner implements Runnable {
        // @Override
        public void run() {
            while (threadex) {
                try {
                    doWork();
                    Thread.sleep(30000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                } catch (Exception e) {
                }
            }
        }

        public void doWork() {

            runOnUiThread(new Runnable() {

                public void run() {
                    new startasynch().execute();

                }
            });
        }
    }

thradex初始化为false

开始按钮正在调用此功能:

threadex = true;

if (myThread.getState() == Thread.State.NEW)
{
    myThread.start();
}

停止按钮正在调用:

threadex = false;

第一次启动效果很好,停止运行良好,但是当我尝试重新启动它时它不起作用,当我检查线程状态时,我发现它已终止..有人可以解释一下吗?

2 个答案:

答案 0 :(得分:0)

(big-T)Thread对象管理(小t)线程的生命周期。一个(小t)线程不是可以“重新启动”的东西。这些词并不意味着什么:当你调用myThread.start()时会出现一个小t线程,并且当run()方法返回时它就不再存在了。你不能重新开始不再存在的东西。

Java库开发人员设计了big-T Thread类来反映这种思考线程的方式。如果你想创建一个新的小t线程(即使它将完成旧的线程),你必须创建一个新的大T线程来管理它。

答案 1 :(得分:0)

我认为更简单的解决方案是使用Androids AsyncTask 。它将使您的工作异步,并为您提供所需的所有回调,以保持您的UI线程免费。它看起来像这样:

package com.example.asynctasktest;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;


public class MainActivity extends Activity {

    private MyAsyncTask backgroundTask;

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


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void onButtonPressStopThread(View v){
        backgroundTask.cancel(false);
    }

    public void onButtonPressStartThread(View v){
        startThread();
    }

    public void startThread(){
        backgroundTask = new MyAsyncTask();
        backgroundTask.execute();
    }

    public class MyAsyncTask extends AsyncTask<Void, Void, Void>{

        @Override
        protected Void doInBackground(Void... params) {
            try {
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //Send data to server

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            startThread();
        }
    }
}

编辑:添加了按钮单击以启动和停止线程执行。