异常导致的后退按钮按下(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() { 

...

希望帮助, 再见!

您应该在服务中运行线程。 This video(来自Google I/O 2010)对于如何设计Android应用程序架构中的Android活动生命周期和服务非常有用。

我有同样的问题,但对于当前的实例,我已经创建了以下解决方案。我知道这很尴尬,但如果你知道正确的方法,那么请教我。还有一点我已经读过,除非它包含了将来的任务,否则你无法停止使用Java的线程。像ExecutorService线程...这是真的吗?

public void surfaceCreated(SurfaceHolder holder) { 
     try{ 
     _thread.setRunning(true); 
     _thread.start(); 
     }catch(Exception ex){ 
      _thread = new TutorialThread(getHolder(), this); 
      _thread.start(); 
     } 

    }