使用Asynctask作为私有类还是广播接收器?

时间:2012-09-09 01:23:31

标签: android inheritance android-asynctask broadcastreceiver inner-classes

我正在尝试创建一个使用Asynctask的应用程序。特别是,我希望在不同的活动中使用不同的JSON制作不同的http请愿,而不会在通信完成时冻结活动。

起初我想在这些活动中使用asynctask作为私有内部类,但我看到他们共享了很多代码。所以我想创建一个单独的类并使用广播接收器,因为我需要在收到http请求的结果时进行监视,并且在不同的类中不能直接干扰onPostExecute中的活动。

我想知道的是,什么是更有效和更好的实践。创建一个具有共享代码并扩展asynctask的类,然后为扩展该类的每个活动执行内部类,或者创建一个发送广播的asynctask,并在需要时通过每个活动接收它们。

请原谅我可怜的英语,如果需要,我会尽量明确说明。

提前致谢

3 个答案:

答案 0 :(得分:1)

背景

  

我想知道的是,什么是更有效和更好的实践。创建一个具有共享代码并扩展asynctask的类,然后为扩展该类的每个活动执行内部类,或者创建一个发送广播的asynctask,并在需要时通过每个活动接收它们。

我不清楚为什么这些是你唯一的两个选择。创建一个AsyncTask,例如JsonPetitionTask,然后推送一个新的JsonPetitionTask.Data对象。该对象将包含您的URL,您的JSON以及您需要的任何其他数据。

设置AsyncTask

这样的事情:

public class JsonPetitionTask extends AsyncTask<JsonPetitionTask.Data, Integer, Boolean> {
    protected Boolean doInBackground(JsonPetitionTask.Data... args) {
        for (int i = 0; i < args.length; i++) {
            JsonPetitionTask.Data data = args[i];
            // Send your JSON; check for errors, and return false if needed.
            if (isCancelled()) break;
        }
        return true;
    }

    protected void onProgressUpdate(Integer... progress) {
        // Show progress?
    }

    protected void onPostExecute(Boolean result) {
        // result is your success true/false.
    }

    public static class Data {
        public String jsonContent;
        public String petitionUrl;

        public Data(String content, String url) {
            jsonContent = content;
            petitionUrl = url;
        }
    }
}

调用JsonPetitionTask

然后你可以这样称呼它:

JsonPetitionTask.Data data = new JsonPetitionTask.Data(myJSON, myURL);
new JsonPetitionTask().execute(data);

瞧,你只使用一个没有接收器的课程来执行你的AsyncTask

实施回调

现在,如果你想注册一个回调(某些特定于调用代码的执行),那就有点棘手了。 如果这是你要找的内容的一部分,我很乐意编辑这篇文章并解释它。

要添加回调,我们可以使用Runnable类在作业完成后执行一些代码。

首先,我们需要在Data内部类中添加一个新字段:

public Runnable callback;

接下来,在我们致电execute()之前,我们需要向data对象添加新的回调。

data.callback = new Runnable() {
    public void run() {
        // Whatever code you want to run on completion.
    }
};

第三,在JsonPetitionTask课程中,我们需要一系列要运行的内容:

private ArrayList<Runnable> mRunnables = new ArrayList<Runnable>();

确保在doInBackground()循环的每次迭代中,您mRunnables.add(data.callback);

最后,在onPostExecute()中,我们需要将其称为:

protected void onPostExecute(Boolean result) {
    for (Runnable r : mRunnables)
        if (r != null) r.run();
}

我确实意识到我没有向result发送Runnable,但我不想实现新的Runnable类型来处理这个问题。如果你需要这个,我想这对你来说是一些功课!

答案 1 :(得分:1)

我发现最好的方法就是创建扩展AsyncTask的公共类,然后在你使用它的每个活动中覆盖onPostExecute函数。

示例:

MyDataTask dataTask = new MyDataTask() //you can add your parameters in class constructor
        {
            @Override
            protected void onPostExecute(Object result) //replace Object with your result type
            {
                MyActivity.this.doStuff(result); //use result in current activity
            }
        };

您还可以创建一些自定义函数来设置数据任务中的私有变量

dataTask.AddParam("user", username);
dataTask.AddParam("pass", pass);

然后用你的args执行它......

dataTask.execute(myArgs);

答案 2 :(得分:1)

我使用Async任务类作为单个类。对于每个Webservice调用,我都使用了独特的IntentFilter来广播响应。 把广播接收器放在每个班级。你有完美的解决方案。 它运作良好。