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