我试图让我的用户界面对事件(如按钮按下,线程完成等)在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,你总是可以使用通知来显示进度,并返回到你的应用程序