【问题标题】:Android switching from activitiesAndroid 从活动切换
【发布时间】:2013-09-10 13:11:43
【问题描述】:

我正在制作一个在其 onCreate 中包含 MainActivity 的 Android 应用程序,检查它是否必须下载文件。检查发生在 AsynchTask 类中。 我有第二个活动PrefsActivity 启动Prefsfragment 以获得偏好。

现在当我从PrefsActivity 回来时,再次发出onCreate。 但整个检查不必再次发生。

导致偏好的代码

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.preferences:
            Intent intent = new Intent(this, PrefsActivity.class);
            startActivityForResult(intent, 1);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

偏好代码

public class PrefsActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit();

    ActionBar actionBar = getActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
}
}

在MainActivity中启动Asynchtask的代码

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    PropertiesManager.getUniqueInstance().loadProperties(PropertiesManager.PROPERTIES_FILE, this);

    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    boolean auto_update = sharedPreferences.getBoolean("pref_autoUpdate", true);
    File downloadFile = getExternalFilesDir("media/" + Downloader.DOWNLOAD_FILE_NAME);

    if (auto_update || !downloadFile.exists()) {
        try {
            if (new Downloader(this).execute().get()) {
                receiveBroadcast(this);
            } else {
                schedule = Parser.getUniqueInstance().parse(this);
                ScheduleBuilder.getUniqueInstance().build(this, (DayBean) schedule.get(9));
            }
        } catch (InterruptedException ex) {
            Log.e(TAG, ex.getMessage());
        } catch (ExecutionException ex) {
            Log.e(TAG, ex.getMessage());
        }
    } else {
        schedule = Parser.getUniqueInstance().parse(this);
        ScheduleBuilder.getUniqueInstance().build(this, (DayBean) schedule.get(9));
    }
}

【问题讨论】:

  • 我不明白你的意思吗?更清楚
  • 当你从其他活动回来时 onResume() 将被调用,而不是 onCreate()
  • 如果重新创建了初始活动,也可以调用 onCreate。
  • 你看到savedInstanceState 参数了吗?谷歌它并使用它:)
  • 您可以将“下载文件”的状态保存在共享首选项/SaveInstance 包中,并可以使用它来启动异步任务。当活动 1 再次创建时,您可以使用 shared-pref/SavedInstance Bundle 来避免再次运行异步任务。希望这是您所要求的。

标签: android android-activity android-fragments android-actionbar


【解决方案1】:

仅当 savedInstance 捆绑包为空时,才在第一个活动中创建 AsyncTask。这意味着由于配置更改或用户导航回它(您的情况),不会重新创建活动。比如:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(savedInstanceState == null) {
        //instantiate the AsyncTask and execute it 
    }
}

【讨论】:

  • 我无法上班。我创建了 onsavedinstancestate 来放置一个布尔值。并在 oncreate if savedinstancestate == null 初始化一个异步。但似乎已保存的实例状态始终为空。
  • 第一次启动活动时为空。
  • 是的。但是当我转到首选项活动并通过操作栏中的向上按钮返回时,它仍然会启动异步
  • 发布启动异步任务的代码,我会告诉你如何修复它。
  • 嗯,我该如何回复。当我粘贴它说长的代码时。还是我必须编辑我的问题?
猜你喜欢
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多