普通网友 2025-02-11 23:01 采纳率: 66.7%
浏览 6
已结题

Android Studio定时器在低版本api中不起作用,在高版本就正常

img

img

针对电视开发的app,电视是安卓5.1,基本功能就是从sqlserver数据库每秒读取一次数据,在主界面的textview上显示出来。创建新项目时是选的tv,测试运行效果如下:
1.高版本的安卓电视正常,数据库数据发生变化时,主界面的人名随之变换
2.红米note12正常,也是高版本

3.需要使用此app的安卓5.1电视只在进入程序时运行一次timer,能显示正确的名字,但后面无论数据库怎么改成它都不动了
4.建了个安卓5.0版本的虚拟机,也是数据读取一次后面就不动了

还尝试了handler那个定时器的方法,效果和timer一样,安卓5.x的版本都是只执行一次就不再重复执行了

但是如果定时方法内是打印文字话,我监测日志它是可以一直打印的,一秒打印一次。

搞了好几天也没弄明白咋回事,按说安卓5.x的版本不可能实现不了这个功能啊,我肯定是哪里没弄对,哪位可以解惑?

  • 写回答

5条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-02-11 23:01
    关注
    让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    针对您提出的问题,下面将从几个方面进行分析,并推荐可能的解决方案。您的主要问题是如何在安卓5.1的电视设备上实现从SQL Server数据库定时读取数据并更新UI,但只成功读取了一次后就不再更新。我们将分析可能的原因和解决方案,并提供示例代码。

    1. 可能的原因

    1. Threading(线程问题): 在安卓中,更新UI必须在主线程中执行。如果您的数据读取逻辑在子线程中运作,而在子线程中更新UI,很可能会导致界面无法更新。
    2. 定时任务逻辑: 确保使用的定时器或Handler能够正确周期性触发。如果设置不当,可能只在启动时运行一次。
    3. 网络或数据库连接问题: 确保能够在非UI线程中持续与SQL Server数据库建立连接并读取数据。数据库连接可能未能在Timer/Handler中正确维护。
    4. 权限设置: 应确保在您的Android Manifest文件中设置了访问网络的权限。

    2. 解决方案

    使用 Handler 和 Runnable 定时更新 UI

    下面是一个简单的实现示例:

    public class MainActivity extends AppCompatActivity {
        private TextView textView;
        private Handler handler;
        private Runnable runnable;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            textView = findViewById(R.id.textView);
            handler = new Handler();
            // 定义Runnable
            runnable = new Runnable() {
                @Override
                public void run() {
                    // 从数据库读取数据的逻辑
                    String name = fetchNameFromDatabase();
                    textView.setText(name);
                    
                    // 每秒更新一次
                    handler.postDelayed(this, 1000);
                }
            };
            // 启动定时器
            handler.post(runnable);
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            // 清除handler回调
            handler.removeCallbacks(runnable);
        }
        private String fetchNameFromDatabase() {
            // 连接数据库并获取数据的逻辑
            // 示例返回值,实际应为数据库查询结果
            return "示例姓名";
        }
    }
    

    3. 注意事项

    • UI更新在主线程: 一定要确保textView.setText(name);是在主线程中执行的,Handler默认是在主线程中执行的。
    • 网络访问: 读取数据库的操作可能涉及网络请求,记得在子线程中进行。如果是网络请求,请使用AsyncTaskThread,读取到数据后再通过Handler更新UI。
    • AndroidManifest权限: 确保有网络访问权限:
      <uses-permission android:name="android.permission.INTERNET"/>
      

    4. 总结

    对于低版本安卓设备,常常会面临兼容性和线程管理等问题。使用Handler和Runnable不仅可以确保循环保留任务,还能确保UI更新在主线程中进行。同时,请确保与数据库连接持续有效,避免连接中断。 如还有其他问题或需要进一步的代码示例,欢迎您继续提问!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 2月20日
  • 已采纳回答 2月12日
  • 创建了问题 2月11日