Java Android主线程在退出异步任务时暂停
我目前正试图找出在退出ASyncTasks时如何避免主线程中出现停顿,我将尝试用框架代码解释问题的具体位置。很抱歉,如果这是重复的,我没有看到任何其他关于ASyncTasks在执行期间暂停主线程的帖子。我对问题的起因有一个假设,但我不知道它是否正确。如果是对的,或者是错的,我想知道处理这种情况的“正确”方法Java Android主线程在退出异步任务时暂停,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我目前正试图找出在退出ASyncTasks时如何避免主线程中出现停顿,我将尝试用框架代码解释问题的具体位置。很抱歉,如果这是重复的,我没有看到任何其他关于ASyncTasks在执行期间暂停主线程的帖子。我对问题的起因有一个假设,但我不知道它是否正确。如果是对的,或者是错的,我想知道处理这种情况的“正确”方法 public class AST extends ASyncTask<String, Integer, Void> { private Activity mActivity;
public class AST extends ASyncTask<String, Integer, Void> {
private Activity mActivity;
private interfaceObject mInterface;
public AST(Activity activity, interfaceObject interface) {
mActivity = activity;
mInterface = interface;
}
@Override
protected void onPreExecute() {
//mInterface.setStatus("Starting...");
mInterface.setStatus("Doing Stuff...");
}
@Override
protected String doInBackground(Void... params) {
String string = doStuff();
//mInterface.setStatus("Did Stuff."); As mentioned this shouldn't be done.
return string;
}
@Override
protected void onProgressUpdate(Integer... progress) {
//mInterface.setStatus("Doing Stuff...");
mInterface.progressUpdate(progress[0], progress[1]);
}
@Override
protected void onPostExecute(String result) {
mInterface.setStatus("Finished.");
mInterface.astDone(result);
}
private String doStuff() {
StringBuilder string = "";
for(int i=0; i<10000; i++) {
string.append("A");
publishProgress(i, 10000);
}
return string.toString();
}
}
progressBar和statusBar都是在创建()时初始化的成员变量,尽管现在看来可能没有必要这样做。这是错的吗
private ProgressBar progressBar;
private TextView statusBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
statusBar = (TextView) findViewById(R.id.textView);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
}
Edit3:根据建议将setStatus()移出onProgressUpdate()
setStatus(字符串状态)编辑主线程上textView的文本
具体怎么做(如果这个方法的主体是什么?)(onPreExecute
、onPublishProgress
和onPostExecute
)
另一件事——这条无辜的路线:
string += "A";
实际创建的新字符串是字符串的10k倍
尝试的事项:
- 查看注释掉
setStatus
调用doInBackground()
- 在
doStuff()
方法中使用StringBuilder而不是String
setStatus方法位于主线程的接口上。你说得对,我可能不应该这样做(我忘了)但最初添加它纯粹是为了尝试调试正在发生的事情。我感谢您的提醒。另外,感谢您提供有关StringBuilder的信息,我会尝试!它不允许我编辑我的评论,我意识到您现在对setStatus方法的意思,它应该根本无法触及这些视图。为什么这不会崩溃(我正在从doInBackground编辑视图)?在尝试从背景线程编辑视图时,切换到StringBuilder会导致线程崩溃,但是帧跳过仍然会发生。我已相应地编辑了OP。谢谢!可能它正在调用mInterface.setStatus(“正在处理…”);
,这反过来会在TextView上设置10k次文本(或mInterface.progressUpdate
-不确定它的作用),我已经在OP中包含了setStatus和progressUpdate。感谢您在这方面花时间!这实际上可能是在设置“做事情…”10000次,所以这对我来说有点愚蠢,我会改变它,但它不应该导致巨大的暂停,对吗?编辑:我将setStatus从onProgressUpdate()中移出,我会编辑OP以匹配它。仍然会暂停。
string += "A";