微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AsyncTask 不从 postexecute 更新 UI

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?