Android onClick()任务都会立即发生

时间:2011-09-28 00:25:39

标签: java android onclick textview handler

我正在尝试为我的应用程序开发一个功能,它可以从互联网上提取一串文本(有点像推特,但更基本),并在屏幕上以透明窗口显示。用户看到一个大盒子旁边有一个刷新按钮,两个下方的小空间我想要一个小进度监视器(只是一个TextView),一旦刷新按钮是显示“刷新...”单击,然后“刷新成功!”一旦成功从互联网上拉出文本字符串并显示。这只是为了向用户保证按下按钮时实际发生了某些事情。

经过批次的研究后,我得出的结论是,更新TextView的方法是使用处理程序来执行runnable,它将更新TextView中的文本。所以我的代码看起来像这样:

    refreshbutton.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View abc)
        {
                //display "Refreshing..."
                refreshhandler.post(refreshingmsg);

            /*Code to pull the string of text from the internet goes here (not shown)*/

                //display "Refresh successul!"
                successfulhandler.post(successfulmsg);

                //clear the "Refresh successful" message after 2 seconds
                clearhandler.postDelayed(clearmsg, 2000);
            }
    });

我希望这样有道理。我的问题是这些事情都会立即发生:我希望显示“刷新...”消息,然后手机连接到互联网以查找更新的文本字符串,然后“刷新成功” “成功显示互联网字符串后显示的消息。但实际发生的是onClick方法中的所有命令都没有实际发生,直到手机已经从互联网上提取消息,因此根本不显示“刷新...”消息。那么当用户点击按钮时实际发生的事情是一两秒钟没有任何事情发生(大概是因为手机忙于从互联网上拔出字符串),然后突然显示来自互联网的字符串以及“刷新”消息成功了!”

那为什么会这样呢? onClick应该以这种方式工作吗?如果是这样,有解决方法吗?我没有发布我的runnable和handler语句,因为我不确定它会有什么不同......但如果它有帮助那么我可以发布它们!

另外,你可以从中得知我没有做过很长时间的android(或者确实是java),但我正在努力,所以请温柔!谢谢:))

1 个答案:

答案 0 :(得分:1)

正在发生的事情是您的代码锁定了网络通信,并且不允许您的应用使用处理程序值更新自己。

你应该为你创建一个AsyncTask

OnPreExecute方法上,更改您的用户界面,向用户显示您正在刷新内容。阅读您的代码似乎是您正在更新图像,请在此处执行此操作。

doInBackground方法上进行实际的网络通信,可选步骤是使用onProgressUpdate(Progress...)更新UI以通知用户操作正在进行中。

onPostExecute方法上,您可以更新用户界面以反映新内容。

有关详细信息,请查看AsyncTask中的文档,您也可以搜索StackOverflow,这里有很多关于它的好问题。

作为旁注,我建议您根本不使用处理程序,AsyncTasks更易于使用,代码看起来更好。