【问题标题】:Android AsyncTask: Adding views to an activity inside an AsyncTask?Android AsyncTask:将视图添加到 AsyncTask 中的活动?
【发布时间】:2012-07-28 21:02:03
【问题描述】:

我正在开发一个 twitter 应用程序的搜索组件。我一直在常规课程中进行解析,并尝试以这种方式将视图添加到活动中,但没有奏效。在我的帖子中:
Android 2.3.3: Crash when getting a LinearLayout from (LinearLayout)findViewById(R.id.<linear_layout_id>)
一位非常有帮助的 stackoverflow 用户告诉我,我最好的选择是将所有解析调用放入 asynctask 并将视图添加到 onPostExecute() 上的活动中。

所以我的问题是,我可以从 XML 中选择一个布局,向它添加一个视图,然后将它保存在 asyctask 的 onPostExecute() 中吗?

【问题讨论】:

    标签: android android-layout twitter android-asynctask


    【解决方案1】:

    当然可以,要么传递视图,要么将包含视图的 Activity 传递给 AsyncTask 的构造函数。只要确保您不在 doInBackground 方法中使用这些对象即可。

    事实上我上周也做过类似的事情:

    @Override
    protected void onPostExecute(Article[] articles) {
        ArrayAdapter<Article> arrayAdapter = new ArticleAdapter(context, articles);
        listView.setAdapter(arrayAdapter);
        listView.setVisibility(View.VISIBLE);
        progressBar.setVisibility(View.GONE);
    }
    

    listView 是作为构造函数参数传递的 ListView,与 context 相同,即包含视图的 Context(活动)。

    编辑:假设您定义 AsyncTask 然后:

    • doInBackground 必须返回一个 Class3 对象并将 Class1 对象数组(定义为 Class1...)作为参数
    • onProgressUpdate 必须将 Class2 对象数组(定义为 Class2...)作为参数
    • onPostExecute 必须将 Class3 对象作为参数
    • ...

    有关更多信息,您可以阅读 Android 文档:http://developer.android.com/reference/android/os/AsyncTask.html

    【讨论】:

    • 那么,类定义应该是
      public MyTask extends AsyncTask?
    • 不,构造函数参数与AsyncTask的类定义无关。 (已编辑答案,因为评论中的布局不是为此而制作的)。只有将它传递给 execute 方法时才会出现这种情况。
    • 要添加视图,我必须 1. 在 onPostExecute 中执行并 2. 将 Class3 作为布局或上下文传递?
    • Class3 对象不应该是视图,而是进入视图的数据。
    • 哦,这也是doInBackgroud的返回类型?
    【解决方案2】:

    在onPostExecute中使用runOnUiThread(mRunnable)方法。如果你想对ui进行任何更改,则全部更改为runOnUiThread。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多