Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 要从多个类调用的公共异步任务_Java_Android_Architecture_Android Asynctask - Fatal编程技术网

Java 要从多个类调用的公共异步任务

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

我是Android新手。自从我开始做这个项目已经有几个星期了。通过阅读已经编写的代码,我看到很多私有异步任务基本上都是这样做的(调用API),因此我想知道是否有更好的解决方案,我的想法是创建一个名为ApiCaller的公共异步任务,该任务将返回一个JSONObject,负责解析JSON的将是调用ApiCaller的类:

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);
 }


}