AsyncTaskLoader使用问题:点击按钮无响应且无报错,求原因
解决AsyncTaskLoader点击按钮无响应且无日志输出的问题
我来帮你排查这个问题,你的代码里有两个关键细节没处理到位,导致点击按钮后Loader根本没执行后台任务:
问题1:AsyncTaskLoader需要主动触发加载
AsyncTaskLoader不像AsyncTask那样调用execute就会直接运行,它必须在onStartLoading()回调里调用forceLoad()方法,才会启动loadInBackground()执行后台逻辑。你的MyLoader没有重写这个方法,所以哪怕Loader被初始化了,也不会主动开始工作。
问题2:按钮点击时调用initLoader无效
你在onCreate()里已经调用过initLoader(0, null, this)初始化了Loader,之后再调用initLoader不会有任何动作——因为initLoader的逻辑是:如果指定ID的Loader已经存在,就直接复用它,不会重新创建也不会触发新的加载流程。所以点击按钮时的调用相当于做了无用功。
修复步骤
1. 修改MyLoader,添加onStartLoading方法
重写onStartLoading()并调用forceLoad(),让Loader启动时自动触发后台任务:
public class Myloader extends AsyncTaskLoader<String> { int i; public Myloader(Context context) { super(context); } @Override protected void onStartLoading() { super.onStartLoading(); // 强制启动后台加载流程 forceLoad(); } @Override public String loadInBackground() { for(i=0;i<=100;i++){ try { Thread.sleep(50); Log.d("waad","loadInBackground"+i); } catch (InterruptedException e) { e.printStackTrace(); } } return "Task result"; } }
2. 修改按钮点击方法,用restartLoader替代initLoader
restartLoader会销毁已存在的Loader(如果有),然后重新创建并启动新的Loader,这样每次点击按钮都会触发新的后台任务:
public void StartMysynstack (View view){ loaderManager.restartLoader(0,null,this); }
修改完成后,点击按钮你应该就能在Logcat里看到从0到100的日志输出,任务结束后TextView也会显示"Task result"了。
内容的提问来源于stack exchange,提问作者wad
相关产品推荐
相关产品推荐

