我正在尝试创建一个使用Asynctask的应用程序。特别是,我希望在不同的活动中使用不同的JSON制作不同的http请愿,而不会在通信完成时冻结活动。
起初我想在这些活动中使用asynctask作为私有内部类,但我看到他们共享了很多代码。所以我想创建一个单独的类并使用广播接收器,因为我需要在收到http请求的结果时进行监视,并且在不同的类中不能直接干扰onPostExecute中的活动。
我想知道的是,什么是更有效和更好的实践。创建一个具有共享代码并扩展asynctask的类,然后为扩展该类的每个活动执行内部类,或者创建一个发送广播的asynctask,并在需要时通过每个活动接收它们。
请原谅我可怜的英语,如果需要,我会尽量明确说明。
提前致谢
答案 0 :(得分:1)
我想知道的是,什么是更有效和更好的实践。创建一个具有共享代码并扩展asynctask的类,然后为扩展该类的每个活动执行内部类,或者创建一个发送广播的asynctask,并在需要时通过每个活动接收它们。
我不清楚为什么这些是你唯一的两个选择。创建一个AsyncTask
,例如JsonPetitionTask
,然后推送一个新的JsonPetitionTask.Data
对象。该对象将包含您的URL,您的JSON以及您需要的任何其他数据。
这样的事情:
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.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来广播响应。 把广播接收器放在每个班级。你有完美的解决方案。 它运作良好。