我正在开发一个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;
第一次启动效果很好,停止运行良好,但是当我尝试重新启动它时它不起作用,当我检查线程状态时,我发现它已终止..有人可以解释一下吗?
答案 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();
}
}
}
编辑:添加了按钮单击以启动和停止线程执行。