Java Android主线程在退出异步任务时暂停

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;

我目前正试图找出在退出ASyncTasks时如何避免主线程中出现停顿,我将尝试用框架代码解释问题的具体位置。很抱歉,如果这是重复的,我没有看到任何其他关于ASyncTasks在执行期间暂停主线程的帖子。我对问题的起因有一个假设,但我不知道它是否正确。如果是对的,或者是错的,我想知道处理这种情况的“正确”方法

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";