如何解决AsyncTask 不从 postexecute 更新 UI
在应用程序 statrs 之后,我有 2 个 AsyncTasks 在后台运行。第一个是获取位置,完成后调用另一个任务。第二个任务完成后,它应该在 postexecute 中更新 UI,但它没有。 它应该用数据填充recyclerview,隐藏加载图标并显示recyclerview。
private FusedLocationProviderClient fusedLocationClient;
Location location;
RecyclerView recV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.loading).setVisibility(View.VISIBLE);
recV = findViewById(R.id.rv);
recV.setLayoutManager(new linearlayoutmanager(MainActivity.this));
new getLocation().execute(); //the first task gets called here
}
这是第一个请求位置的异步任务:
class getLocation extends AsyncTask<String,Boolean,Boolean> {
@Override
protected Boolean doInBackground(String... params) {
fusedLocationClient = LocationServices.getFusedLocationProviderClient(MainActivity.this);
if (ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {}
CancellationTokenSource cancellationSource = new CancellationTokenSource();
fusedLocationClient.getCurrentLocation(LocationRequest.PRIORITY_HIGH_ACCURACY,cancellationSource.getToken())
.addOnSuccessListener(MainActivity.this,new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location loc) {
location = loc;
publishProgress(true);
}
}).addOnFailureListener(MainActivity.this,new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
e.printstacktrace();
publishProgress(true);
}
});
while(true){
if(location != null)
return true;
}
}
@Override
protected void onPostExecute(Boolean result) {
if(result){
new getData().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); //Second task called here
//Updating the UI here doesn't work
}
}
}
在 UI 上编辑任何内容都不起作用。它被调用,登录到控制台工作,但在这里修改 UI 没有任何作用。
同样的事情也发生在第二个任务上。
runOnUiThread 也不做任何事情。
class getData extends AsyncTask<String,Boolean> {
@Override
protected Boolean doInBackground(String... params) {...}
@Override
protected void onPostExecute(Boolean result) {
Log.d(TAG,"this gets displayed in the logcat");
RecyclerView_Adapter adapter = new RecyclerView_Adapter(routes);
recV.setAdapter(adapter);
findViewById(R.id.loading).setVisibility(View.GONE);
findViewById(R.id.rv).setVisibility(View.VISIBLE);
findViewById(R.id.rvui).setVisibility(View.VISIBLE);
//But these UI tasks just don't do anything
这段代码有什么问题? 任何帮助表示赞赏!
解决方法
这段代码太可怕了。如果 getCurrentLocation 返回 null(它可以),您的循环将永远不会退出,因为位置永远不会改变——它要么总是为空,要么总是不为空。很可能你没有得到任何位置,因此永远循环。由于所有 AsyncTask 共享一个线程,这将阻止您应用中的所有异步任务。
去掉循环,用 return return location != null
代替。如果 location 为空,请确保 onPostExecute 中的任何代码都可以处理它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。