在Android上的后台更新调用Activity时显示第二个Activity

时间:2012-08-07 04:22:24

标签: android multithreading android-intent android-asynctask android-activity

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

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

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

如何在后台操作另一个Activity时在前台显示一个Activity?我认为AsyncTasks打开数量的限制可能导致此问题,因为我创建了一个我收到的每个数据点都有新的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");
    }
}

1 个答案:

答案 0 :(得分:2)

一旦活动不再显示,Android完全有可能完全销毁它。

您应该从前台服务进行数据收集,将数据放入一个持久的数据存储,就像sqlite数据库支持的contentprovider一样。

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

这可能听起来有点过头了,但即使是在简单的屏幕旋转上,你也会丢失所有数据并且可能会崩溃。