Java 由onclicklistener生成的重复线程

Java 由onclicklistener生成的重复线程,java,android,multithreading,duplicates,Java,Android,Multithreading,Duplicates,我有一个带有onclicklistener的按钮,可以从internet下载图片并在UI线程中更新进度条。当用户第一次点击按钮时,它工作正常,但是如果用户点击按钮几秒钟&。。。当下载未完成时,会发生重复的过程。如何解决此问题 Button btnDownload = (Button) findViewById(R.id.btndownload); final TextView txtcaption = (TextView) findViewById(R.id.txtcaption

我有一个带有onclicklistener的按钮,可以从internet下载图片并在UI线程中更新进度条。当用户第一次点击按钮时,它工作正常,但是如果用户点击按钮几秒钟&。。。当下载未完成时,会发生重复的过程。如何解决此问题

    Button btnDownload = (Button) findViewById(R.id.btndownload);
    final TextView txtcaption = (TextView) findViewById(R.id.txtcaption);
    final ProgressBar progress = (ProgressBar) findViewById(R.id.progress);
    btnDownload.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            new Thread(new Runnable() {

                OnProgressDownloadListener listener = new OnProgressDownloadListener() {

                       @Override
                          public void progressDownload(final int percent) {
                         new HANDLER.post(new Runnable() {

                              @Override
                               public void run() {
                               progress.setProgress(percent);
                               txtcaption.setText(percent + " %");
                               if (percent >= 100) {

                                  txtcaption.setText("completed");
                                  Toast.makeText(activity.this, "download completed", Toast.LENGTH_SHORT).show();
                                        }
                                  }
                            });
                        }
                  };

                @Override
                public void run() {
       //my download manager                                
                    FileDownloader.download("address/file", DIR + "/file");
                }
            }).start();
        }
    });

}

在类中有一个初始化为NULL的线程变量。在onClickListener中,检查该变量的值。如果为null,则启动一个新线程并将该线程的值保存在变量中。如果不是,请忽略按钮的按下或弹出一个下载的祝酒词。记住在线程完成时将变量设置回null


我强烈建议使用AsyncTask而不是线程,这样会更干净。

一个简单的方法是:

首先,首先声明一个线程。。。
Thread

然后创建一个简单的方法,其中包含您希望在按下按钮时执行的线程

private void getPicture()
    {
        myThread = new Thread()
        {
            public void run()
            {
                // Place thread code here...
            }
        };
        myThread.start();
    }
然后,您可以在按下按钮时进行简单检查,如果线程处于活动状态,则不要调用
getPicture
方法…buttonDownload.setOnClickListener(new View.OnClickListener())


一旦开始下载,请禁用该按钮,或者在开始下载时设置一个标志。是什么让这不够“好”
{
    @Override
    public void onClick(View view)
    {
        if (myThread.isAlive())
        {
            // Thread is alive, do not launch again
        }
        else
        {
            // Thread is not running so call method...
            getPicture();
        }
    }
});