3

我的 mainThread扩展自Activity,它启动了两个从不同 UDP 源收集数据的异步任务。其中一项任务应将数据附加到此图形库。我正在从以下onPostExecute部分对UI 进行更新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文本字段会自动更新。

我尝试了以下方法:

layout.postInvalidate(); //and invalidate

我不知道如何让 Android 更新 GraphView。

这是 XML 的相应部分:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/graph1"
    android:layout_width="match_parent"
    android:layout_height="305dp" >

</LinearLayout>

非常感谢您的帮助!

4

3 回答 3

3

@Rishabh 的答案不正确。两者onPostExectureonProgressUpdate在 UI 线程上调用。接受的解决方案比您所在的原始轨道更笨拙,即在onPostExecute. 在那里这样做绝对是一种优雅的方式。你不想在runOnUiThread这里打电话。

正如@weakwire 所说:使图表无效是正确的方法,而不是使布局无效。无论如何,接受的答案不是在后台执行任务然后用结果更新 UI 的 Android 方式。

于 2012-09-17T05:15:03.230 回答
0

AsyncTask 不是 Ui 线程,使用 runOnUiThread(..) 代替 Asynctask。

1 rl-:父视图。2 myView -: 子视图

//使用这个方法 //

    runOnUiThread(new Runnable() {

        //@Override
        public void run() {
            // TODO Auto-generated method stub
            rl.addView(new myView(getApplicationContext()));
        }
    });
于 2012-09-16T12:33:16.507 回答
0

要使更改生效,您需要调用:

graphView.onDataChanged(false, false);

正如@weakwire 和@vkinra 所建议的那样,这将使 和 无效GraphViewGridLabelRenderer但这是推荐的方法,正如您在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),因此您应该使用它们以确保最佳性能。此外,您可以查看此答案以查看GraphView#onDataChanged(boolean, boolean)'s javadoc。

于 2018-11-10T07:59:32.980 回答