0

我正在编写一个连接到蓝牙设备、读取数据并使用 AChartEngine 将其绘制在主 Activity 中的 Android 应用程序(这整个部分都有效)。

我想包含第二个 Activity,其中包含一个 WebView(由 PhoneGap 提供支持)。当在主 Activity 中按下按钮时,第二个 Activity 应该打开,而第一个 Activity 继续在后台活动,并且 AChartEngine 图表继续更新。

我当前的代码使用 AsyncTask 解决了这个问题,它在应用程序开始通过蓝牙接受和绘制数据之前运行良好。之后,当我按下按钮打开第二个 Activity 时,整个应用程序崩溃。

如何在后台操作另一个 Activity 时在前台显示一个 Activity?我认为打开的 AsyncTask 数量的限制可能会导致此问题,因为我为收到的每个数据点创建一个新的 AsyncTask 以便将其异步添加到图表中,但随时打开的数量似乎远低于极限。

以下是我当前代码的相关部分:

public class viewer extends Activity
{
    /* ... */

    public void handleButtonPress() {
        // called when our button is pressed
        new StartWebview(viewer.this).execute();
    }

    protected class StartWebview extends AsyncTask<Void, Void, Void> {
        public Activity activity;

        public StartWebview(Activity activity) {
            this.activity = activity;
        }

        @Override
        protected Void doInBackground(Void... values) {
            Intent i = new Intent(viewer.this, WebActivity.class);
            activity.startActivity(i);
            return null;
        }
    }

    protected class NewPoints extends AsyncTask<Double, Void, Void> { // called each time we receive a new data point

        @Override
        protected Void doInBackground(Double... values) {
            mCurrentSeries.add(values[0], values[1]); // x, y
            if (mChartView != null) {
                mChartView.repaint();
            }
            return null;
        }
    }
}
public class WebActivity extends DroidGap
{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.loadUrl("file:///android_asset/www/index.html");
    }
}
4

1 回答 1

2

一旦某个活动不再显示,Android 完全有可能将其完全销毁。

您应该从前台服务收集数据,将数据放入持久数据存储中,例如由 sqlite 数据库支持的 contentprovider。

然后使用加载器获取数据并将其提供给您的图表工具。每次新数据自动到达数据库时都会通知内容提供者。

这听起来可能有点矫枉过正,但即使是简单的屏幕旋转,您也会丢失所有数据并可能崩溃。

于 2012-08-07T04:30:22.800 回答