Android 我的应用程序因异步任务而崩溃

Android 我的应用程序因异步任务而崩溃,android,android-asynctask,Android,Android Asynctask,我是android新手,我的简单应用程序有问题。 我使用AsyncTask使用一个非常简单的计数器 当我运行应用程序并启动计数器时,它会数到10,然后不是打印“完成!”应用程序就会崩溃,我不知道为什么。这是我的密码。 (活动有3个按钮用于创建、启动和取消任务) 公共类AsyncTaskActivity扩展了AppCompatActivity{ 异步任务myAsyncTask; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(s

我是android新手,我的简单应用程序有问题。 我使用AsyncTask使用一个非常简单的计数器

当我运行应用程序并启动计数器时,它会数到10,然后不是打印“完成!”应用程序就会崩溃,我不知道为什么。这是我的密码。 (活动有3个按钮用于创建、启动和取消任务)

公共类AsyncTaskActivity扩展了AppCompatActivity{
异步任务myAsyncTask;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u async\u task);
}
公共静态void startActivity(上下文){
意向意向=新意向(上下文,AsyncTaskActivity.class);
背景。开始触觉(意图);
}
公共void createNewTask(视图){
TextView TextView=findViewById(R.id.text\u view\u id);
myAsyncTask=新的myAsyncTask(文本视图);
}
公共无效startTask(视图){
myAsyncTask.execute();
}
公共作废取消任务(视图){
myAsyncTask.cancel(true);
}
私有静态类MyAsyncTask扩展了AsyncTask{
私有文本视图文本视图;
公共MyAsyncTask(TextView TextView){
this.textView=textView;
}
@凌驾
受保护对象doInBackground(对象[]对象){

对于(int counter=0;counter您不能从后台线程更新UI,这意味着
doInBackGround
中的代码在后台线程上运行

 @Override
 protected Object doInBackground(Object[] objects) {
     for(int counter = 0; counter <= 10; counter ++){

         if(!isCancelled()) {
             textView.setText(String.valueOf(counter));
             SystemClock.sleep(500);
         }
         else
             break;
        }

        textView.setText("DONE!");
        // ^^^^^ crash , cannot update UI from background thread
        return null;
    }
注意:如果取消该任务,则会发现
textView.setText(String.valueOf(counter));
出现相同的崩溃


始终使用
generic
类型并传递结果计数器值并相应地更新UI

private static class MyAsyncTask extends AsyncTask<Void,Void,Integer>{

    private TextView textView;

    public MyAsyncTask(TextView textView){

        this.textView = textView;
    }


     protected Long doInBackground(Void... obj) {
        for(int counter = 0; counter <= 10; counter ++){

            if(!isCancelled()) {
                SystemClock.sleep(500);
                return counter;
            }
            else
                break;
        }
         return null;
     }


     protected void onPostExecute(Integer result) {
        if(result != null)
            textView.setText(String.valueOf(result));
        else
            textView.setText(String.valueOf("Done"));
            // your current code will set done no matter the task is cancelled or not
     }
 }
私有静态类MyAsyncTask扩展了AsyncTask{
私有文本视图文本视图;
公共MyAsyncTask(TextView TextView){
this.textView=textView;
}
受保护的长沙发背景(无效…obj){

对于(int counter=0;counter,您无法从AsyncTask doInBackground(仅主线程)编辑视图。因此,将setText移动到onPostExecute

@Override
protected void onPostExecute(Void result)

    textView.setText("DONE!");

}

张贴事故日志
private static class MyAsyncTask extends AsyncTask<Void,Void,Integer>{

    private TextView textView;

    public MyAsyncTask(TextView textView){

        this.textView = textView;
    }


     protected Long doInBackground(Void... obj) {
        for(int counter = 0; counter <= 10; counter ++){

            if(!isCancelled()) {
                SystemClock.sleep(500);
                return counter;
            }
            else
                break;
        }
         return null;
     }


     protected void onPostExecute(Integer result) {
        if(result != null)
            textView.setText(String.valueOf(result));
        else
            textView.setText(String.valueOf("Done"));
            // your current code will set done no matter the task is cancelled or not
     }
 }
@Override
protected void onPostExecute(Void result)

    textView.setText("DONE!");

}