Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:在后台更新表格布局_Java_Android - Fatal编程技术网

Java Android:在后台更新表格布局

Java Android:在后台更新表格布局,java,android,Java,Android,在Android应用程序上工作,我需要一个TableLayout,以便在不阻塞UI线程的情况下定期更新。以下是表格布局: <TableLayout android:id="@+id/pidata" android:layout_width="wrap_content" android:layout_height="match_parent"> </TableLayout> 以前的代码 Handler piHandler = new Handler(); Ru

在Android应用程序上工作,我需要一个TableLayout,以便在不阻塞UI线程的情况下定期更新。以下是表格布局:

<TableLayout
  android:id="@+id/pidata"
  android:layout_width="wrap_content"
  android:layout_height="match_parent">
</TableLayout>
以前的代码

Handler piHandler = new Handler();
Runnable piRunnable = new Runnable() {
    @Override
    public void run() {
        while (isRunning) {
            piHandler.post(new Runnable() {
                @Override
                public void run() {
                    //logic to add to TableLayout
                }
            });
            try {
                Thread.sleep(3000);
            } 
            catch (InterruptedException ex) {
            }
        }   
    }           
};
new Thread(piRunnable).start();

您不能在UI线程上调用Thread.sleep,因为它将在方法未完成时阻止屏幕的所有更新,您必须使用以下解决方案之一:

  • 使用android.os.Handler和重复消息(handleMessage),这些消息将在UI线程上运行,但将在后台等待新消息到达;(简单的解决方案)

  • 自己使用一个线程,并将消息发布到处理程序以返回UI线程;(最佳解决方案)

  • 使用倒计时(需要固定的时间来启动并达到0,停止进程)

  • 将AsyncTask与while(true)循环一起使用,并从doInBackground使用publishProgress,并在OnProgressUpdate处处理状态更改以接触UI(不推荐,因为AsyncTasks必须具有较短的生命周期)

  • 使用服务执行与AsyncTask相同的操作,并向活动发送广播;(复杂解决方案)


好的,谢谢您的回复!这是我的第一个Android应用程序,所以我不太了解线程的来龙去脉。我以前的代码使用了一个handler和handler.post,在我们有一个从另一个线程更新的SurfaceView之前,它似乎工作得很好。是否意识到thread.sleep会阻止曲面视图。使用SurfaceView需要将更新发布到画布,您确定需要吗?我无法发布使用处理程序的其他代码,因此我编辑了原始代码。我们必须使用曲面视图,因为我们正在UI上绘制圆。我们正在使用无人机SDK,并围绕某些地理位置绘制圆圈。因此,我们需要一个表的组合来更新,并绘制更新的圆圈。如果更新间隔秒,您可以简单地覆盖常规视图的onDraw而不是RecyclerView。为什么不使用相同的Runnable来更新SurfaceView?
Handler piHandler = new Handler();
Runnable piRunnable = new Runnable() {
    @Override
    public void run() {
        while (isRunning) {
            piHandler.post(new Runnable() {
                @Override
                public void run() {
                    //logic to add to TableLayout
                }
            });
            try {
                Thread.sleep(3000);
            } 
            catch (InterruptedException ex) {
            }
        }   
    }           
};
new Thread(piRunnable).start();