我正在使用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");
}
}
}
答案 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
希望它能清除你的怀疑。