我的目标很简单,输入一个地址,点击一个按钮测试一个URL,如果没有得到预期的结果,敬酒信息,然后什么都不做。如果获得预期结果,请继续执行该程序。
因为我不能在UI线程中使用URL,所以我使用AsyncTask,问题是:虽然我知道AsyncTak的结果,如何通知活动做或不做任何事情? 我想是的OnClickListener像这里面的声明:
if (result is not expected) return; else continue do things.
我不能写在上面onPostExecute声明,它将返回onPostExecute(),而不是onClickLIstener()。
另一个是:即使我可以将结果传递给activity(即onClickLIstener()),当结果到达时,UI线程可能已经运行了一些其他代码,但它们不应该在知道结果之前。
总之,我需要URL结果来决定如何运行剩余的代码,因此不能使用异步任务,我该怎么办?
谢谢。
下面是示例代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
btnConfirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new XXX().execute(code);
});
}
class XXX extends AsyncTask<String, Void, String> {
protected String doInBackground(String... strArr) {
XXXXX;
}
protected void onPostExecute(String result) {
XXXXX;
}
}
好的网络任务无论如何都应该是异步完成的,你可以通过使用某种不确定的进度条来确保MainUI上没有其他事情发生。当你启动asynctask时,将它设置为Visible,然后将它设置为不可见的'onPostExecute()'并完成剩下的事情。 – wanpanman
听起来不错,你能告诉我更多细节吗?除此之外,这种任务最常用的方式是什么:基于URL结果在活动中做或不做任何事情。 ? – caibirdcnb
这取决于你在做什么。如果你有一些需要连接到服务器的连接,你可能会使用一个连续运行的线程,然后使用一个Handler来连接MainUI。如果有一次这样的事情发生,就像点击按钮然后发生了什么事情,那么asynctask是一个很好的选择。 如果你看下面的Eenvincible的答案,你只需在'onPostExecute()'中调用该函数,并将该函数中需要做的任何事情。如果你需要某种结果,然后给该函数添加参数,例如'private void executeOnAsyncSuccess(String result)' – wanpanman