由后退按钮按下仍然运行的线程引起的异常(Android)

时间:2010-09-21 16:24:32

标签: android multithreading

我使用的代码类似于下面的代码,但线程是通过按下按钮启动的。当我按下按钮时,会抓住网址上的数据并将其切换到另一个活动。我遇到的问题是,当我在其他活动并点击后退按钮时,我得到一个异常,说该线程已经启动。我已经尝试在活动加载检查isAlive时杀死线程,但它似乎不会死。有没有人碰巧知道如何将这个活动恢复到原始状态,创建的线程没有运行?

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);
    }  
};  

}

5 个答案:

答案 0 :(得分:1)

我的一个应用程序遇到了类似的问题:我在不同的线程上做了一些事情,当线程运行时,用户将切换到横向模式创建一个新的活动。一旦线程完成,应用程序将强制关闭,因为线程指向不再存在的活动。

我对此问题的解决方案是使用AsyncTask。基本上它抽象了一个线程和一个处理程序,并允许你在后台任务上获得定期进度更新(即实现像ProgressBar这样的东西)。我还从Activity.onDestroy()方法调用了AsyncTask.cancel(),因此当活动被销毁时,AsyncTask将停止运行。

答案 1 :(得分:0)

在这种情况下,您不必跨越新线程来启动活动。 .rather

这样做

{ 在你的spa线程中。

progressHandler.sendMessage(progressHandler.obtainMessage());

}

处理程序progressHandler = new Handler(){         public void handleMessage(final Message msg){

        Intent newIntent = New Intent(Iconic.this, otherClass.class);
    startActivity(newIntent);

   }
};

答案 2 :(得分:0)

您不能在同一个Thread实例上调用两次.start()。你试过重新创建吗?

...

checkUpdate = new Thread(checkUpdateRunnable).start();

...

private Runnable checkUpdateRunnable = new Runnable() {  
    public void run() {

...

希望有所帮助, 再见!

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

    }