【问题标题】:Accessing String in AsyncTask from outer class从外部类访问 AsyncTask 中的字符串
【发布时间】:2014-06-12 09:35:52
【问题描述】:

我有我的主要活动,并且在该活动中我有一个私有 AsyncTask 类。在我的公共 AsyncTask 类中,有一个字符串在我的 AsyncTask 完成后我需要访问我的 MainActivity。

我如何能够从我的主活动访问我的异步任务类中的字符串?

编辑:我在 Activity 的 OnCreate 中调用 AsyncTask

异步任务类(接近底部是我需要的字符串):

public class getLikes extends AsyncTask<String, String, String> {

    JSONObject obj = null;


    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub

        try {
            String jsonUser = fb.request("5027904559");

            obj = Util.parseJson(jsonUser);


        } catch (FacebookError e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;

    }

    @Override
    protected void onPostExecute(String args) {
        // TODO Auto-generated method stub


     //I need to use this String elsewhere in my MainActivity
        String name = obj.optString("likes");




    }

}

这里是我需要使用字符串的地方(如果重要的话)

        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons
            .getResourceId(0, -1), true, names));

【问题讨论】:

  • 尝试为你需要的字符串使用一个全局变量。
  • 在您的主类中放置一个名称变量并从您的异步任务中访问它

标签: android android-asynctask


【解决方案1】:

只需创建一个构造函数,在其中提交像这样的 Observer:

interface TaskCompletionObserver {
    taskCompleted(Object result)
}

构造函数如下所示:

public GetLikes(TaskCompletionObserver observer){
    super();
    this.mObserver = observer;
}

然后在 onPosteExecute 中简单地调用:

mObserver.taskCompleted(whatever_you_want_to_pass);

然后您的活动应该实现 TaskCompletionObserver 并且在 taskCompleted 的实现中您可以做您需要做的事情(例如更新 UI)

然后您可以稍后将您的实施扩展到完全成熟的observer patter

这是一个很好的设计,让您的代码保持可维护性和灵活性。

【讨论】:

  • 我认为你的意思是声明构造函数如下:public getLikes(TaskCompletionObserver observer)。我不相信 AsyncTask 有一个接受 Context 实例的构造函数。
  • 我认为这有点矫枉过正,您可以从内部类访问外部类的变量。如果您需要知道值何时准备好,则可以使用此系统
  • 我认为在 90% 的情况下,不将异步任务设置为活动的内部类是值得的。其他 10% 是代码演示。在开发好的软件时,您应该始终尝试保持您的代码可维护。如您所见,这只是几行代码。
  • @MarcoAcierno - 也许吧。但是将 AsyncTask 与使用它的活动分离通常是更好的设计。为 getLikes 类和 Activity 类编写(单元)测试更容易。更容易重用,更容易在以后重构,等等......
  • 嗯,Asynctask 与 Activity 密切相关(在大多数情况下,不要读错)所以在 Activity 类之外创建类没有多大意义(可能有最好把它放在外面但我不是在谈论它的情况)。就我个人而言,我认为在这种特定情况下,所有这些都可以避免并将 UI 更新放在 onPostExecute 中,因为他只是在 navdrawer 中添加元素,我认为他不需要在其他地方使用这个值(但我不能确定关于它)。 (PS你的构造函数中的参数应该是TaskCompletionObserver而不是IObserver)
猜你喜欢
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 2011-01-23
  • 1970-01-01
相关资源
最近更新 更多