从AsyncTask更新Activity

3

我是一名iOS开发者,正在学习Android,但有些东西让我很难理解。目前我有一个datamanager类,在这个类中有一个AsyncTask来更新数据。在OnPreExecute中,我弹出一个活动来显示更新情况。我知道我可以使用extras将初始信息传递给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...如果我没记错的话,你的“datamanager”类不是一个Activity吧?如果是这样的话,那么你并没有充分利用AsyncTask的最佳设计方式。 - Squonk
你是正确的。这不是一个活动。 - mouser58907
2个回答

6

AsyncTask旨在嵌套在Activity类中使用,以达到最佳效果。

AsyncTask的“特殊之处”在于它不仅是一个工作线程 - 它将处理doInBackground(...)中的代码的工作线程与运行在Activity UI线程上的方法结合起来,其中onProgressUpdate(...)onPostExecute(...)是最常用的方法。

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

简而言之,与其从AsyncTask触发您的“更新”Activity,您的更新Activity本身应该有一个嵌套的AsyncTask,它用于处理更新并向UI发布进度。


我认为最好的方式是让一个类来管理所有数据,另一个类来管理用户界面。但在Android中似乎不是这样?这是否意味着我需要在更新类中创建数据库助手的新实例?我想我知道如何做到这一点,只是对我来说有些不同。 - mouser58907
2
@mouser:我为我的当前应用程序所做的方式是,我有一个“db helper”类,它扩展了SQLiteOpenHelper。我还扩展了Application类,该类维护对单个db helper实例的静态引用。这意味着所有Activities等都可以通过使用MyApp.dbHelper访问helper。 - Squonk

2
你有两个选择:
1) 在AsyncTask构造函数中传递一个activity实例以便在其上调用某些方法:
new MyTask(this).execute();

所以,您可以做以下操作:
  public MyTask (Activity activity) {
   this.activity = activity;
  }

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

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


我想我不明白的是,我该如何获取活动的实例?此外,这两种方法中有一种比另一种更好吗? - mouser58907
请查看更新后的答案。此外,使用handler有很多好处。其中之一是可以隐藏活动的实现细节,从而降低与另一个类的耦合度。 - Vladimir Ivanov
我正在尝试第一种方法,但效果不太好。这是我在onPreExecute中的代码,第二行导致了崩溃: Intent myIntent = new Intent(mContext,UpdateActivity.class); updateActivity.startActivity(myIntent); - mouser58907

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接