2016-07-25 53 views
0

专家,如何做或基于AsyncTask结果什么都不做?

我的目标很简单,输入一个地址,点击一个按钮测试一个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; 
    } 
} 
+0

好的网络任务无论如何都应该是异步完成的,你可以通过使用某种不确定的进度条来确保MainUI上没有其他事情发生。当你启动asynctask时,将它设置为Visible,然后将它设置为不可见的'onPostExecute()'并完成剩下的事情。 – wanpanman

+0

听起来不错,你能告诉我更多细节吗?除此之外,这种任务最常用的方式是什么:基于URL结果在活动中做或不做任何事情。 ? – caibirdcnb

+0

这取决于你在做什么。如果你有一些需要连接到服务器的连接,你可能会使用一个连续运行的线程,然后使用一个Handler来连接MainUI。如果有一次这样的事情发生,就像点击按钮然后发生了什么事情,那么asynctask是一个很好的选择。 如果你看下面的Eenvincible的答案,你只需在'onPostExecute()'中调用该函数,并将该函数中需要做的任何事情。如果你需要某种结果,然后给该函数添加参数,例如'private void executeOnAsyncSuccess(String result)' – wanpanman

回答

1

这应该很容易。试试这个方法:

由于您已经将AsyncTask作为活动的内部类,因此您可以轻松地在onPostExecute()中返回结果,然后检查请求是否成功。

现在,这里是最后一部分:您的活动像这样创建一个方法:

private void executeOnAsyncSuccess(){ 
    //place the code here you want to run 
} 

现在你可以很容易地把它里面onPostExecute()

您也可以使用Events来做到这一点,但这种方法应该可行!

我希望这有助于!

+0

抱歉,我无法关注。当预期结果时,你是否在onPostExecute()内部执行executeOnAsyncSuccess()?但结果只是开始,我有许多其他的方法,内部类,把它们放在executeOnAsyncSuccess()里面?我不确定。我更喜欢的是如何在OnClickListener()而不是onPostExecute()中获取结果的方法 – caibirdcnb

+0

如果您位于onPostExecute()中,请使用if语句来确定结果是否成功,如果是,请调用executeOnAsyncSuccess方法 - 然后你在里面的方法,做任何你会做的内部onClickListener – Eenvincible

+0

好的,现在doInBackground()给onPostExecute()真或假,但如何在UI线程(OnClickListener)的变量?例如,String code = xxxx;在UI线程中。现在我在onPostExecute()中,如何使用代码? – caibirdcnb

0

我刚才了解到,也许Callable是一个好方法,使用它的V get()。