Android 异步任务;调用方法onPreExecute()后未调用doInbackground()
我确实在我的项目中添加了异步库,并且已经检查过了,我不知道为什么代码流没有进入异步任务 代码Android 异步任务;调用方法onPreExecute()后未调用doInbackground(),android,android-asynctask,Android,Android Asynctask,我确实在我的项目中添加了异步库,并且已经检查过了,我不知道为什么代码流没有进入异步任务 代码 public-void-doMysql() { Log.v(“doMysql”,“已访问”); 新建异步任务(){ @凌驾 受保护的void onPreExecute(){ super.onPreExecute(); Log.e(“AsyncTask”、“onPreExecute”); } @凌驾 受保护字符串doInBackground(无效…参数){ Log.v(“AsyncTask”、“doInB
public-void-doMysql()
{
Log.v(“doMysql”,“已访问”);
新建异步任务(){
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
Log.e(“AsyncTask”、“onPreExecute”);
}
@凌驾
受保护字符串doInBackground(无效…参数){
Log.v(“AsyncTask”、“doInBackground”);
字符串msg=“”;
DefaultHttpClient httpclient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(“http://172.16.100.172:52273/mysql");
ArrayList nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair(“myday”,Integer.toString(day\u picker.getYear())+
addZero(day_picker.getMonth()+1)+
addZero(day\u picker.getDayOfMonth());
添加(新的BasicNameValuePair(“mystar”,changeStar(day\u picker.getMonth()+1,day\u picker.getDayOfMonth()));
添加(新的BasicNameValuePair(“mybt”,changeBloodType(blood_picker.getValue()));
添加(新的BasicNameValuePair(“mynum”,“myPhone.getText());
添加(新的BasicNameValuePair(“yournum”,“+partnerPhone.getText());
添加(新的BasicNameValuePair(“myregID”,regid));
试一试{
Log.v(“setEntity”、“before”);
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
Log.v(“setEntity”、“after”);
}捕获(不支持DencodingException e1){
Log.v(“UnsupportedEncodingException”,”);
e1.printStackTrace();
}
//172.16.101.28
试试{
日志v(“后”、“前”);
HttpResponse HttpResponse=httpclient.execute(httppost);
Log.v(“post”、“after”);
Log.v(“HttpResponse”,HttpResponse.getEntity().toString());
}捕获(客户端协议例外e){
Log.v(“ClientProtocolException”、“ClientProtocolException”);
e、 printStackTrace();
}捕获(IOE异常){
Log.v(“IOException”、“IOException”);
e、 printStackTrace();
}
返回味精;
}
@凌驾
受保护的void onPostExecute(字符串msg){
Log.v(“AsyncTask”、“onPostExecute”);
}
}.执行(空,空,空);
}
我在代码'log.v(“AsyncTask”,“doInBackground”);'中有一个log语句
但它不会出现在日志记录器的Log.v(“AsyncTask”、“doInBackground”);中 您应该与executor一起执行任务
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
因为在较低版本的Android中,所有异步任务都是在单个后台线程中执行的。因此,新任务可能正在等待,直到其他任务开始工作
在Android的较低版本中(实际上是在pre-Honeycom上),您不能在executor上执行AsyncTask
将代码更改为
public void executeAsyncTask()
{
AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.e("AsyncTask", "onPreExecute");
}
@Override
protected String doInBackground(Void... params) {
Log.v("AsyncTask", "doInBackground");
String msg = null;
// some calculation logic of msg variable
return msg;
}
@Override
protected void onPostExecute(String msg) {
Log.v("AsyncTask", "onPostExecute");
}
};
if(Build.VERSION.SDK_INT >= 11/*HONEYCOMB*/) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
task.execute();
}
}
public void executeAsyncTask()
{
AsyncTask任务=新建AsyncTask(){
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
Log.e(“AsyncTask”、“onPreExecute”);
}
@凌驾
受保护字符串doInBackground(无效…参数){
Log.v(“AsyncTask”、“doInBackground”);
字符串msg=null;
//msg变量的一些计算逻辑
返回味精;
}
@凌驾
受保护的void onPostExecute(字符串msg){
Log.v(“AsyncTask”、“onPostExecute”);
}
};
如果(Build.VERSION.SDK_INT>=11/*蜂巢*/){
task.executeOnExecutor(异步task.THREAD\u POOL\u EXECUTOR);
}否则{
task.execute();
}
}
我也处于同样的情况
AsyncTask.cancel(布尔可能中断frunning)
传递truedoInBackground()
现在被中断了asyncTask
仍在运行。。。从而防止执行另一个asyncTask
。它的代码< dodoBead()方法在循环中运行无限,所以我只需要改变条件来考虑所有可能的“中断”情况……/P>这对你不起作用吗?
我已经这样做了,但问题仍然存在,问题是我使用AsyncTask
运行长时间的后台任务,这些任务会永远运行,因此ThreadPoolExecutor
的工作线程已经被占用
在我的例子中,AsyncTask.THREAD\u POOL\u EXECUTOR
(使用调试器获取执行器属性)具有以下ff属性:
maximumPoolSize = 3
largetsPoolSize = 2
corePoolSize =2
因此,禁用一个长期运行的异步任务使我的doInBackground代码得以运行,但这不是正确的解决方案
正确的解决方案是,我将长时间运行的任务移动到自定义线程中,而不是使用
AsyncTask
引用Android文档
首次引入时,AsyncTasks是在单个服务器上串行执行的
背景线程。从甜甜圈开始,它被改成了一个
允许多个任务并行运行的线程。从
蜂窝,任务在单个线程上执行,以避免常见的
并行执行导致的应用程序错误
如果确实需要并行执行,可以调用
executeOnExecutor(java.util.concurrent.Executor,对象[])与
线程池执行器
使用此代码段触发异步任务:
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
asyncTaskInstance.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
else
pdfPageChanger.execute(params);
尝试.execute()而不是.execute(null,null,null);结果是一样的。。。你为什么认为这是一个解决办法?在本地,它与“.execute(null,null,null)”配合得很好,可能还有另一个异步任务executing@brights
maximumPoolSize = 3
largetsPoolSize = 2
corePoolSize =2
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
asyncTaskInstance.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
else
pdfPageChanger.execute(params);