Android用户界面问题



我试图让我的用户界面对事件(如按钮按下,线程完成等)在Android实时(显然)。

我有一个按钮布局,其中一个按钮用于使用FTP从远程计算机复制未知数量的文件。所有这一切的FTP部分工作得很好,但我就是找不到一种方法让用户知道事物的状态:

在我看来,这些州是:1)在"正常"菜单中选择"下载文件"。2)按下确认(下载过程可能相当漫长,也许我不想错误地选择它——但现在它是一个单独的线程,所以可能需要重新考虑。3)下载4)下载完成,恢复正常菜单

我希望在单独的线程中运行FTP代码,并通过使用thread. isalive()构造,等待线程完成并相应地更改显示。

我唯一没能做的就是显示文件正在下载。无论我尝试什么,显示都会从"确认下载"视图跳转到"正常菜单"视图。(请注意,这些不是Android以任何方式定义的视图。)

代码:

Btn.setOnClickListener (new View.OnClickListener()
{
    @Override
    public void onClick (View v)
    {
        hideTempWidgets();
        Btn01.setVisibility (View.GONE);                
        Btn02.setVisibility (View.GONE);                
        Btn03.setVisibility (View.GONE);                
        verfBtn.setVisibility (View.VISIBLE);
        verfBtn.setText ("Press to Verify");
        verfBtn.setOnClickListener (null);
        verfBtn.setOnClickListener (new View.OnClickListener()
        {
            @Override
            public void onClick (View v)
            {
                runOnUiThread (new Runnable()
                {
                    public void run()
                    {
                        verfBtn.setText ("Downloading...");
                    }
                });
                Thread temp = new Thread (new Runnable()
                {
                    public void run()
                    {
                        try
                        {
                            FileTransfer.getFiles (getAddr().trim());
                        }
                        catch (SQLException e)
                        { }
                    }
                }, "ftp");
                temp.start();
                while (temp.isAlive());                                 
                verfBtn.setVisibility (View.GONE);
                Btn01.setVisibility (View.VISIBLE);
                Btn02.setVisibility (View.VISIBLE);
                Btn03.setVisibility (View.VISIBLE);
                alert (true, VIBE_BLIP);
            }
        });
    }
});
有没有人面对过这个问题,并提出了一个体面的解决方案?

没有发生的是setText到"下载…",或者至少,如果它这样做,不是当我想要它和太快看…最后,特别令人沮丧的是,当我删除代码以运行FTP线程时,该命令仍然正常工作。

谢谢,r .

这个任务似乎非常适合异步任务。基本上,异步任务是一个带有内置线程安全组件的线程,允许您向UI发布更新并在任务完成时通知。一个流行的想法是显示一个旋转器或进度条,直到AsyncTask完成,然后取消它。

有关异步任务的更多信息,请参见:http://developer.android.com/reference/android/os/AsyncTask.html

我认为你的错误在这里:

temp.start ();而(temp.isAlive ());

onClick()中的代码已经在图形线程上运行了,所以不需要runOnUIThread()方法,你不应该用while()语句阻塞它,这实际上是阻塞UI线程,直到线程完成。

我的建议:你可以启动一个AsyncTask,并相应地更新UI。

由于这是一个非常长的文件传输,我建议您考虑使用服务来完成这项工作。如果您使用线程,用户将会把您的应用程序置于其他应用程序之上。否则你的线程就会被杀死。最糟糕的是,你无法阻止用户进入主屏幕或其他应用程序(有些技巧是可行的,但用户会生气)。

如果你使用service,你总是可以使用通知来显示进度,并返回到你的应用程序

最新更新