2011-07-14 77 views
1

我试图让我的用户界面,以便对事件(如按下按钮,螺纹完井等)实时的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.

+0

阅读'AsyncTasks'!它们比大多数时候更有用,而不仅仅是扩展'Thread'。 – binnyb

+0

我有,但党大部分我读过的东西很难理解!你知道我可以遵循的任何非常简单的例子吗? – Rich

回答

4

此任务似乎非常适合异步任务。基本上,异步任务是一个带有内置线程安全组件的线程,允许您将更新发布到UI并通知任务完成时间。 一个流行的想法是显示一个微调或进度条,直到AsyncTask完成,然后解雇它。

有关异步任务的详细信息,请参阅:http://developer.android.com/reference/android/os/AsyncTask.html

+0

经过大量的诅咒,呜呜声和跺脚之后,我最终获得了我的AsyncTask来传输GD文件......但是除非我真的错过了一些明显的东西,我不知道如何完成对UI的更改这个单独的线程。它必须是相当简单明显的东西,但我该如何实现它? – Rich

+0

onProgressUpdate和onPostExecute中采取的操作是线程安全的,可用于更新UI – Pyrodante

0

,我认为你的错误是在这里:

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

内部的onClick()的代码是在图形线程已经在运行,所以没有必要对runOnUIThread()方法,你不应该使用一段时间()语句,这实际上是阻塞UI阻止它线程直到线程完成。

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

+0

我在过去查找过AsyncTasks的相关信息,但我唯一能找到的例子并不是很有用 - 坦率地说,就像Android Developers网站上的其他所有内容一样。任何人都可以向我展示一个白痴简单的例子,我可能能够适应我的目的? – Rich

0

因为它是一个很长的文件传输,我建议你考虑地做好售后服务工作。如果你使用线程,用户将被束缚在你的应用程序之上。否则你的线程可能会被杀死。最糟糕的是,你可以做些什么来防止用户进入主屏幕或其他应用程序(有些技巧是可能的,但用户会被激怒)。

如果您使用服务,您始终可以使用通知来显示进度并返回到您的应用程序。

+0

我是初学者,不知道如何执行您所描述的内容。你可以发布一个例子的链接?谢谢。 – Rich