【问题标题】:Displaying a second Activity while the calling Activity is being updated in the background on Android在 Android 的后台更新调用 Activity 时显示第二个 Activity
【发布时间】:2012-08-07 04:22:23
【问题描述】:

我正在编写一个连接到蓝牙设备、读取数据并使用 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");
    }
}

【问题讨论】:

  • 对不起,不是你的 AsyncTask 的问题。一个活动未显示在屏幕上,那么与该活动相关的所有方法也将被销毁。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回答! :) 你能给我一些示例代码,了解如何在这些单独的部分之间建立连接吗?
  • 您可能不熟悉的最大部分可能是内容提供者。它在整个 android 中广泛使用,因此值得一试,并且通常是数据存储的首选。 vogella.com/articles/AndroidSQLite/article.html 然后使用 IntentService 来处理您已经在做的数据收集,这样就很容易了。要从内容提供者加载数据,您应该使用加载器,vogella 的教程中也介绍了该加载器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多