执行其余代码后异步任务完成?

时间:2014-12-12 12:01:13

标签: java android http android-asynctask httpurlconnection

我正在使用AsnncTask向服务器发送HTTP请求。我正在使用三个参数调用一个函数checkServer()。从这个功能我打电话给一个班级     。URLDataProvider()执行(" URL&#34)。得到()

当我调用checkServer时,调用asynctask但在获得404响应代码后调用checkProtocol方法。在调用OnPostExecute方法之后。

之后,如果响应代码是404,我再次从Post执行调用checkServer()。但是其余代码被调用,之后我得到200 Ok的响应代码。我可以知道为什么checkProtocol()&其余代码在checkServer()结束之前调用。

这是代码

checkServer("http","servername","firstlogin");

checkProtocol(host_ip, portnumber);
-----------Some code-------------
 new Thread(new Runnable(){

网址数据提供商

private class UrlDataProvider3 extends AsyncTask<String, Void, String>
{

    String ret="";
    int checkStatus;
    Boolean exception=false;

    @Override
    protected String doInBackground(String... url) 
    {

        HttpURLConnection con = null;

        try 
          { 

            HttpURLConnection.setFollowRedirects(true);
            con = (HttpURLConnection) new URL(url[0]).openConnection();
                con.setRequestMethod("HEAD");
                con.setConnectTimeout(20000);



            if(con.getResponseCode()==HttpURLConnection.HTTP_NOT_FOUND && con.getURL().toString().contains("pdata/Login"))
            {

                checkStatus=1;
                return "done";

            }
            else if(con.getResponseCode()==HttpURLConnection.HTTP_NOT_FOUND && con.getURL().toString().contains("cdata/Login"))
            {

                 checkStatus=2;
                 return "done";
            }

            if(con.getResponseCode()==HttpURLConnection.HTTP_OK && con.getURL().toString().contains("pdata/Login"))

            {


                return "done";


            }
            else if(con.getResponseCode()==HttpURLConnection.HTTP_OK && con.getURL().toString().contains("cdata/Login"))
            {



                return "done";

            }

          }

        catch (SocketTimeoutException ste)
        {

            con.disconnect();
            return null;
        }
        catch (IOException e)
          {





          }

    return ret;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);



         if(checkStatus==1)
            {
                if(SettingsChaned)
                {

                 checkServer("http", "cdata","thirdlogin");
                }
                else 
                {

                checkServer("http", "cdata","firstlogin");
                }

            }
            else if(checkStatus==2)
            {
                if(SettingsChaned)
                {

                checkServer("http", "pdata","thirdlogin");
                }
                else
                {

                checkServer("http", "pdata","firstlogin");
                }
            }

}

2 个答案:

答案 0 :(得分:1)

AsynTask会将您的执行移动到另一个线程,您所谓的其余代码将在UI线程中编写,并在AsynTask完成之前调用它。

如果要在AsynTask完成其工作后执行其余代码,则应在onPostExecute中编写其余代码

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
        // background task
     }



     protected void onPostExecute(Long result) {
        // rest of code
     }
 } 

更改AsyncTask的参数

答案 1 :(得分:1)

“AsyncTask允许正确和容易地使用UI线程。此类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

AsyncTask旨在成为Thread和Handler的辅助类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于短操作(最多几秒钟。)如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent包提供的各种API,例如执行者,ThreadPoolExecutor和FutureTask。“

如果您在AsynTask之外有代码行,请记住这一点

{
    new LongOperation().execute(""); //This runs in another thread on its doInBackground() method
    showAToast(); //this is still in the main thread.
    //And so on...
}

showToastMethod将在主线程上运行,而LongOperation()AsyncTask将继续在另一个线程中运行。

如果有更多部门的例子,您可以访问:The Documentation here

希望它能清除你的怀疑。