线程实现的问题

时间:2011-08-24 07:28:38

标签: android

我有一个开始按钮来启动我的下载数据功能( startdownload())。 当单击开始按钮时,我已经放置了一个文本视图,显示数据已启动下载,当下载完成时,相同的文本视图显示下载已完成。 下载功能放在一个帖子下。

start_button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {                       

                Status.setText("Download Started");

                Thread t = new Thread(){      
                    public void run() {                  
                        startdownload();                                                   
                        runOnUiThread(new Runnable() {                                              
                            public void run() {                                 
                                Status.setText("Download Completed");
                                }                
                            });             
                        }};           
                        t.start(); 
            }
        });

我还有一个停止按钮来停止下载数据,停止线程并显示使用与上述相同的文本视图停止下载。停止按钮代码如下所示

stop_button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {           
                onStop();
                Status.setText("Download Stopped");             

            }

public void onStop() {
        super.onStop();
        isRunning = false;  
        }

问题是,当我点击开始按钮时,文本视图显示下载已开始但在完全下载数据之前单击停止按钮时显示下载已停止 首先在文本视图中显示下载完成后......

请任何一个验证我的线程实现过程有任何问题... 我想这就是为什么它显示下载完成,即使我使用停止按钮停止线程....请帮助我......

3 个答案:

答案 0 :(得分:1)

我认为你可以从线程更新UI,所以请尝试使用处理程序。

谢谢。

答案 1 :(得分:1)

你真的停止了线程吗?或者按下停止按钮后它会继续运行? 您可以使用标记isStopped和线程:

if (!isStopped) {                                                 
    runOnUiThread(new Runnable() {                                              
        public void run() {                                 
            Status.setText("Download Completed");
        }                
    });             
}

并在stop_button中将isStopped设置为true。

答案 2 :(得分:1)

如果onStop()Activity.onStop()回调方法,则不应该调用它。它与你的下载线程无关,无论如何它只是系统调用的系统回调。实际上,不推荐自行停止线程,不推荐使用Thread.stop()方法,如您所知。很容易“停止”在循环中执行某些操作的线程:你只需删除控制循环的标志,结果是线程继续运行,但它什么也没做。您的应用程序体系结构不会让您停止线程,因为您只是在运行任务。发布您的下载代码,您将更清楚自己在做什么以及您想要实现的目标。