异常导致的后退按钮按下(Android)上仍然运行的线程
我使用的代码类似于下面的内容,除了线程是通过按钮启动启动的。当我按下按钮时,url上的数据被抓取,它将我切换到另一个活动。我遇到的问题是,当我在其他活动,并击中后退时,我得到一个例外说,线程已经开始。我已经尝试杀死线程,当活动加载检查isAlive时,但它似乎不会死。有没有人碰巧知道如何让这个活动返回到原来的状态,创建的线程不运行?异常导致的后退按钮按下(Android)上仍然运行的线程
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.http.util.ByteArrayBuffer;
public class Iconic extends Activity {
private String html = "";
private Handler mHandler;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mHandler = new Handler();
checkUpdate.start();
}
private Thread checkUpdate = new Thread() {
public void run() {
try {
URL updateURL = new URL("http://iconic.4feets.com/update");
URLConnection conn = updateURL.openConnection();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while((current = bis.read()) != -1){
baf.append((byte)current);
}
/* Convert the Bytes read to a String. */
html = new String(baf.toByteArray());
mHandler.post(showUpdate);
} catch (Exception e) {
}
}
};
private Runnable showUpdate = new Runnable(){
public void run(){
Intent newIntent = New Intent(Iconic.this, otherClass.class);
startActivity(newIntent);
}
};
}
我也有类似的问题,我的应用程序之一:我是在不同的线程在做什么,而线程运行的用户将切换到横向模式下创建一个新的活动。线程完成后,应用程序将强制关闭,因为线程指向不再存在的活动。
我对这个问题的解决方案是使用AsyncTask。基本上,它抽象了一个线程和一个处理程序,并允许您获取后台任务的定期进度更新(即实现类似ProgressBar的东西)。我还从Activity.onDestroy()方法中调用了AsyncTask.cancel(),所以当活动被销毁时,AsyncTask将停止运行。
在这种情况下,您不必跨越一个新线程来启动活动。 .rather
在spaned线程为此
{ 。
progressHandler.sendMessage(progressHandler.obtainMessage());
}
处理器progressHandler =新的处理程序(){ 公共无效的handleMessage(最终信息MSG){
Intent newIntent = New Intent(Iconic.this, otherClass.class);
startActivity(newIntent);
}
};
不能调用。开始()在同一个线程实例的两倍。你有没有试过重新创建它?
...
checkUpdate = new Thread(checkUpdateRunnable).start();
...
private Runnable checkUpdateRunnable = new Runnable() {
public void run() {
...
希望帮助, 再见!
我有同样的问题,但对于当前的实例,我已经创建了以下解决方案。我知道这很尴尬,但如果你知道正确的方法,那么请教我。还有一点我已经读过,除非它包含了将来的任务,否则你无法停止使用Java的线程。像ExecutorService线程...这是真的吗?
public void surfaceCreated(SurfaceHolder holder) {
try{
_thread.setRunning(true);
_thread.start();
}catch(Exception ex){
_thread = new TutorialThread(getHolder(), this);
_thread.start();
}
}