Java 要从多个类调用的公共异步任务
我是Android新手。自从我开始做这个项目已经有几个星期了。通过阅读已经编写的代码,我看到很多私有异步任务基本上都是这样做的(调用API),因此我想知道是否有更好的解决方案,我的想法是创建一个名为ApiCaller的公共异步任务,该任务将返回一个JSONObject,负责解析JSON的将是调用ApiCaller的类:Java 要从多个类调用的公共异步任务,java,android,architecture,android-asynctask,Java,Android,Architecture,Android Asynctask,我是Android新手。自从我开始做这个项目已经有几个星期了。通过阅读已经编写的代码,我看到很多私有异步任务基本上都是这样做的(调用API),因此我想知道是否有更好的解决方案,我的想法是创建一个名为ApiCaller的公共异步任务,该任务将返回一个JSONObject,负责解析JSON的将是调用ApiCaller的类: public class ApiCaller extends AsyncTask<String, String, JSONObject> { private
public class ApiCaller extends AsyncTask<String, String, JSONObject> {
private static final String TAG = "ApiCall";
private final String apiVersion = "v1";
private final String baseURL = "http://my.api.com/";
private String URL = null;
/**
* Generates the URL to call the API.
*
* @param params List with the params to call the API.
*/
public ApiCaller(ArrayList<NameValuePair> params){
String apiURL = this.baseURL + this.apiVersion + "/?";
String paramsList = URLEncodedUtils.format(params, "utf-8");
this.URL = apiURL + paramsList;
}
@Override
protected JSONObject doInBackground(String ... params) {
Log.i(TAG, "API:");
Log.i(TAG, this.URL);
JSONManager jParser = new JSONManager();
JSONObject jsonObject = jParser.getJSONFromUrl(this.URL);
return jsonObject;
}
或者任何其他解决方案,以避免每次需要调用API时创建新的异步任务?用我目前的代码,我无法得到它,但我不知道丢失了什么?也许在onPostExecute中返回它?不久前我问了一个类似的问题 我找到的解决方案在另一个问题中得到了回答: 基本上,您需要的是一个
接口
我将解释基本原理,尽管你应该通过检查原始答案
您可以创建如下界面:
interface AsyncTaskCompleteListener<T> {
public void onTaskComplete(T result);
}
因为异步任务不能调用方法并获取返回值 您可以在内联代码上使用AsyncTask,并在后执行JSON对象:
new AsyncTask<String, String, JSONObject>(){
@Override
protected Void doInBackground(String... params) {
//...
}
@Override
protected void onPostExecute(JSONObject result) {
// ...
}
}.execute(...);
newasynctask(){
@凌驾
受保护的Void doInBackground(字符串…参数){
//...
}
@凌驾
受保护的void onPostExecute(JSONObject结果){
// ...
}
}.执行(……);
您应该实现一个将传递给异步任务的侦听器。当asynctask完成时,它将调用侦听器的方法:
首先,在新的java文件中创建一个侦听器:
public interface onTaskDoneListener{
void onTaskDone(JSONObject result);
}
将其传递给您的任务:
private onTaskDoneListner donelistner;
public ApiCaller(ArrayList<NameValuePair> params,onTaskDoneListener donelistener){
String apiURL = this.baseURL + this.apiVersion + "/?";
String paramsList = URLEncodedUtils.format(params, "utf-8");
this.URL = apiURL + paramsList;
this.donelistener = donelistener;
}
用法:
new ApiCaller(params,new onTaskDoneListener() {
@Override
public void onTaskDone(JSONObject result) {
//This will be called when the asynctask finishes
//Do something with the result
});
步骤1:定义一个接口
public interface WebServiceListener {
public void onLoginActionComplete (ArrayList<String> arrayList);
}
公共接口WebServiceListener{
public void onLoginActionComplete(ArrayList ArrayList);
}
步骤2:在活动类中实现WebServiceListener
public class LoginActivity extends Activity implements WebServiceListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
/* Calling the AsyncTask here,you could call in Login Button Click... */
WebServiceClient httpclient = new WebServiceClient(this);
httpclient.execute(ssoURLStr);
}
@Override
public void onLoginActionComplete (ArrayList<String> arrayList) {
// TODO Auto-generated method stub
/* Read the response */
String Response = arrayList.get(0);
}
}
公共类LoginActivity扩展活动实现WebServiceListener{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
/*在这里调用AsyncTask,您可以调用登录按钮单击*/
WebServiceClient httpclient=新的WebServiceClient(此);
httpclient.execute(ssoURLStr);
}
@凌驾
public void onLoginActionComplete(ArrayList ArrayList){
//TODO自动生成的方法存根
/*阅读回复*/
字符串响应=arrayList.get(0);
}
}
步骤3:在这里输入您的AsynTask类代码
public class WebServiceClient extends
AsyncTask<String, Integer, ArrayList<String>> {
WebServiceListener listener = null;
/* Constructor added WebServiceListener here */
public WebServiceClient ( WebServiceListener listener)
{
this.listener = listener;
}
@Override
protected ArrayList<String> doInBackground(String... params) {
// TODO Auto-generated method stub
ArrayList<String> arrayList = null;
" write your http code here and get the response and update the
arrayList <String> here"
return arrayList;
}
@Override
protected void onPostExecute(ArrayList<String> arrayList) {
// Returns the contents of the HTML page
listener.onLoginActionComplete (arrayList);
}
}
公共类WebServiceClient扩展
异步任务{
WebServiceListener侦听器=null;
/*构造函数在此处添加了WebServiceListener*/
公共WebServiceClient(WebServiceListener侦听器)
{
this.listener=listener;
}
@凌驾
受保护的ArrayList doInBackground(字符串…参数){
//TODO自动生成的方法存根
ArrayList ArrayList=null;
“在此处编写http代码,获取响应并更新
arrayList在此“
返回数组列表;
}
@凌驾
PostExecute上受保护的void(ArrayList ArrayList){
//返回HTML页面的内容
listener.onLoginActionComplete(arrayList);
}
}
我也问过这个问题。也许这会有所帮助您已经有了onPostExecute(),它是在UI线程上调用的,其参数是泛型的,向它添加另一个接口没有进一步的用途。他想要的是将一个从多个活动调用的Asyntask泛化为一个。检查它是否有意义有接口但有没有办法从那里得到它?据我所知,onPostExecute不返回任何东西它不返回任何东西,但是因为您的调用将实现接口,所以您必须在该类中有一个方法
public void onTaskComplete(t result)
,您将在该类中接收结果。我已经用一个例子更新了我的答案。当然,onPostExecutes返回了一些东西,即与您的接口完全相同的值,以与接口相同的方式作为回调。是的,您可以向AsyncTask添加接口,也可以重写onPostExecute。。。但两者都有…为什么?
public interface WebServiceListener {
public void onLoginActionComplete (ArrayList<String> arrayList);
}
public class LoginActivity extends Activity implements WebServiceListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
/* Calling the AsyncTask here,you could call in Login Button Click... */
WebServiceClient httpclient = new WebServiceClient(this);
httpclient.execute(ssoURLStr);
}
@Override
public void onLoginActionComplete (ArrayList<String> arrayList) {
// TODO Auto-generated method stub
/* Read the response */
String Response = arrayList.get(0);
}
}
public class WebServiceClient extends
AsyncTask<String, Integer, ArrayList<String>> {
WebServiceListener listener = null;
/* Constructor added WebServiceListener here */
public WebServiceClient ( WebServiceListener listener)
{
this.listener = listener;
}
@Override
protected ArrayList<String> doInBackground(String... params) {
// TODO Auto-generated method stub
ArrayList<String> arrayList = null;
" write your http code here and get the response and update the
arrayList <String> here"
return arrayList;
}
@Override
protected void onPostExecute(ArrayList<String> arrayList) {
// Returns the contents of the HTML page
listener.onLoginActionComplete (arrayList);
}
}