布局不';从java线程更新时不显示任何内容

布局不';从java线程更新时不显示任何内容,java,android,multithreading,Java,Android,Multithreading,我正在尝试制作一个应用程序,即监听线程上的URL,如果该位置有某个文件,我的应用程序将在tableLayout中显示内容 我已经设法完成了从URL侦听的第一部分,但现在我无法让它在布局中显示内容。我从URL接收了所有数据,并且我在tableLayout中正确添加了数据,但仍然没有显示任何内容 这就是我所做的 监听URL方法 private void createListenerURL(){ Runnable runnable=new Runnable() { @Override pub

我正在尝试制作一个应用程序,即监听线程上的URL,如果该位置有某个文件,我的应用程序将在tableLayout中显示内容

我已经设法完成了从URL侦听的第一部分,但现在我无法让它在布局中显示内容。我从URL接收了所有数据,并且我在tableLayout中正确添加了数据,但仍然没有显示任何内容

这就是我所做的

监听URL方法

private void createListenerURL(){

Runnable runnable=new Runnable() {
  @Override
  public void run() {
   URL url = new URL(urlPath);
   InputStream inputStream = url.openStream();

  // geting all data from URL and addig in table row like this:

     runOnUiThread(new Runnable() {
        @Override
        public void run() {
         TableLayout tableLayout=(TableLayout)findViewById(R.id.tabeldisplay);

          final TableRow tr=new TableRow(this);
           tr.setId(i);
           tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT,TableRow.LayoutParams.WRAP_CONTENT));

            TextView textview=new TextView(this);
            textview.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
            textview.setText(data.getProductName().get(i));
            textview.setTextSize(fontSizeTabel);
            textview.setTextColor(Color.parseColor("#010101"));

        tr.addView(textview);
      tableLayout.addView(tr);
        }
    });

    // starting a listening thread

  };
    };

    Thread thread=new Thread(runnable);
    thread.start();
    while (1==1){
        try {
            thread.sleep(5000);
            thread.run();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    createListenigURLThread();

}
主要方法

private void createListenerURL(){

Runnable runnable=new Runnable() {
  @Override
  public void run() {
   URL url = new URL(urlPath);
   InputStream inputStream = url.openStream();

  // geting all data from URL and addig in table row like this:

     runOnUiThread(new Runnable() {
        @Override
        public void run() {
         TableLayout tableLayout=(TableLayout)findViewById(R.id.tabeldisplay);

          final TableRow tr=new TableRow(this);
           tr.setId(i);
           tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT,TableRow.LayoutParams.WRAP_CONTENT));

            TextView textview=new TextView(this);
            textview.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
            textview.setText(data.getProductName().get(i));
            textview.setTextSize(fontSizeTabel);
            textview.setTextColor(Color.parseColor("#010101"));

        tr.addView(textview);
      tableLayout.addView(tr);
        }
    });

    // starting a listening thread

  };
    };

    Thread thread=new Thread(runnable);
    thread.start();
    while (1==1){
        try {
            thread.sleep(5000);
            thread.run();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    createListenigURLThread();

}

我的代码是否有问题,或者我需要添加一些内容?

只能从UI线程修改UI。如果要从其他线程更新UI,应使用在主线程上运行的线程,并可以更新UI。

不能从非主线程的线程更新UI。
使用runOnUiThread(newrunnable…)更新ui

查看类的invalidate()方法。在“绘图”部分有描述。

我已经设法解决了我的问题。主要的错误是我没有使用相同的线程,每次迭代时我都在创建一个新线程

这是Wright解决方案

监听URL方法

private void createListenerURL(){
   URL url = new URL(urlPath);
   InputStream inputStream = url.openStream();

   // geting all data from URL and addig in table row like this:

   new Thread(new Runnable() {
     @Override
     public void run() {

         while (1==1){
           try {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                         TableLayout tableLayout=(TableLayout)findViewById(R.id.tabeldisplay);

                         final TableRow tr=new TableRow(this);
                         tr.setId(i);
                         tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT,TableRow.LayoutParams.WRAP_CONTENT));

                         TextView textview=new TextView(this);
                         textview.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
                         textview.setText(data.getProductName().get(i));
                         textview.setTextSize(fontSizeTabel);
                         textview.setTextColor(Color.parseColor("#010101"));

                         tr.addView(textview);
                         tableLayout.addView(tr);
                         }
                });
              } catch (InterruptedException e) {
                 e.printStackTrace();
              }

          try {
              Thread.sleep(refreshRateURL);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
         }
      }).start();
 }

我也尝试过这样做(我已经编辑了我的帖子),看看我是如何尝试的。你正在将layoutParams设置为TableRow.layoutParams.FILL\u父级,TableRow.layoutParams.FILL\u父级。这意味着每个孩子都会试图占据tablelayout中的所有空间。尝试更改LayoutParams,看看它是否有效我甚至按照您的建议尝试过,我使用了WRAP_内容,但仍然没有显示任何内容。尝试设置固定像素值以确保这不是您的问题我也这样做了,但我认为这不是问题所在,因为我的界面没有显示任何内容,甚至main.XML中的修复布局也没有显示