我的主Thread
从Activity
延伸,它启动两个异步任务,从不同的UDP源收集数据。其中一项任务应将数据附加到this图形绘制库。我正在使用onPostExecute
的{{1}}部分对用户界面进行更新:
AsynTask
数据传递到图表,如果我用手指在显示屏上单击它就会正确显示,但我希望软件自动更新图形。 @Override
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
edt2.setText(Integer.toString(result));
// Graph Update
if (graphActive) {
exampleSeries1.appendData(ATList.get(ATList.size()-1), true);
} else {
//do nothing
}
}
文本字段会自动更新。
我尝试了以下内容:
edt2
我不知道如何让Android更新GraphView。
这是XML的相应部分:
layout.postInvalidate(); //and invalidate
非常感谢你的帮助!
答案 0 :(得分:3)
@Rishabh的答案不正确。在UI线程上调用onPostExecture
和onProgressUpdate
。接受的解决方案比您使用的原始曲目更加笨拙,即在onPostExecute
中进行更新。这样做绝对是优雅的方式。你不想在这里打电话给runOnUiThread
。
正如@weakwire所说:使图表无效是正确的方法,而不是使布局无效。无论如何,接受的答案不是Android在后台执行任务的方式,然后用结果更新UI。
答案 1 :(得分:0)
AsyncTask不是Ui Thread使用runOnUiThread(..)而是Asynctask。
1 rl-:父视图。 2 myView - :子视图
//使用此方法//
runOnUiThread(new Runnable() {
//@Override
public void run() {
// TODO Auto-generated method stub
rl.addView(new myView(getApplicationContext()));
}
});
答案 2 :(得分:0)
要使更改生效,您需要致电:
graphView.onDataChanged(false, false);
这将使GraphView
和GridLabelRenderer
无效,如@weakwire和@vkinra所建议,但这是推荐的操作方式,如您在GridLabelRenderer#invalidate(boolean, boolean)
的javadoc中所看到的:
/**
* Clears the internal cache and forces to redraw the grid and labels.
*
* Normally you should always call {@link GraphView#onDataChanged(boolean, boolean)}
* which will call this method.
*
* @param keepLabelsSize true if you don't want to recalculate the size of the labels.
* It is recommended to use "true" because this will improve
* performance and prevent a flickering.
* @param keepViewport true if you don't want that the viewport will be recalculated.
* It is recommended to use "true" for performance.
*/
public void invalidate(boolean keepLabelsSize, boolean keepViewport) { /*...*/ }
这些是与GraphView#onDataChanged(boolean, boolean)
相同的参数,因此您应该使用它们以确保最佳性能。另外,您可以查看此answer以了解GraphView#onDataChanged(boolean, boolean)
的Javadoc。