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