【问题标题】:Updating an Activity from an AsyncTask从 AsyncTask 更新 Activity
【发布时间】:2011-06-02 13:40:23
【问题描述】:

所以我是一名学习 android 的 iOS 开发人员,我很难理解一些事情。现在我有一个数据管理器类。在那个类中,它有一个 AsyncTask 来更新数据。 OnPreExecute 我弹出一个活动以显示它正在更新。我知道我可以使用附加功能将初始信息传递给 UpdateActivity。我的问题是我不确定如何在 OnProgressUpdate 中发送新信息。这是我的代码:

    private class myTask extends AsyncTask<Integer,String,Void>{

    @Override
    protected void onCancelled() {
        super.onCancelled();
        isUpdating = false;
    }

    @Override
    protected Void doInBackground(Integer... params) {
        //My BG Code
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Remove updating view
        super.onPostExecute(result);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Intent myIntent = new Intent(mContext,UpdateActivity.class);
        mContext.startActivity(myIntent);
    }
}

【问题讨论】:

  • "...我有一个数据管理器类。在那个类中它有一个 AsyncTask..."。我认为您的“数据管理器”课程不是活动是正确的吗?如果是这样,那么您没有按照设计的最佳方式使用 AsyncTask。
  • 你是对的。这不是一项活动。

标签: android android-activity android-asynctask


【解决方案1】:

AsyncTask 设计为嵌套在 Activity 类中时效果最佳。

使 AsyncTask '特别' 的原因在于它不仅仅是一个工作线程 - 相反,它结合了一个工作线程来处理 doInBackground(...) 中的代码和在 Activity 的 UI 线程上运行的方法 - onProgressUpdate(...) 和 @987654323 @ 是最常用的。

通过定期从doInBackground(...) 调用updateProgress(...),调用onProgressUpdate(...) 方法允许它操作Activity 的UI 元素(进度条、显示正在下载的文件名称的文本等)。

简而言之,更新 Activity 本身应该有一个嵌套的 AsyncTask 来处理更新并将进度发布到 UI,而不是从 AsyncTask 触发“更新”Activity。

【讨论】:

  • 在我看来,让一个班级管理所有数据,另一个班级管理 UI 似乎更好。但是对于android,情况不是这样吗?这是否意味着我需要在更新类中创建我的数据库助手的新实例?我想我知道如何做到这一点,这对我来说是不同的。
  • @mouser:我为当前应用程序所做的方式是我有一个扩展 SQLiteOpenHelper 的“db helper”类。我还扩展了 Application 类,该类维护对 db 助手的单个实例的静态引用。这意味着所有活动等都可以使用 MyApp.dbHelper 访问帮助器
【解决方案2】:

你有两个选择:

1) 将活动实例传递给 AsyncTask 构造函数,以便在其上调用某些方法:

new MyTask(this).execute();

所以,你可以这样做:

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

  public void onPostExecute(...) {
   activity.someMethod();
  }

2) 传递一个Handler 实例并从 onPostExecute() 向活动发送消息。

【讨论】:

  • 我想我不明白的是,我如何获取活动的实例?另外,这些方法中的一种是否比另一种更好?
  • 查看更新后的答案。此外,由于许多原因,处理程序更好。其中之一是您对另一个类隐藏了活动的实现细节,从而降低了耦合度。
  • 我正在尝试第一种方法,但效果不佳。这就是我在 onPreExecute 中的内容,第二行使它崩溃: Intent myIntent = new Intent(mContext,UpdateActivity.class); updateActivity.startActivity(myIntent);
猜你喜欢
  • 2011-06-03
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 2015-11-24
相关资源
最近更新 更多