为什么AsyncTask在追加新数据后不会自动更新GraphView?

时间:2012-09-16 12:26:20

标签: java android android-asynctask android-graphview

我的主ThreadActivity延伸,它启动两个异步任务,从不同的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

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:3)

@Rishabh的答案不正确。在UI线程上调用onPostExectureonProgressUpdate。接受的解决方案比您使用的原始曲目更加笨拙,即在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);

这将使GraphViewGridLabelRenderer无效,如@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。