Android Async http请求,我应该制作三个不同的类吗?

时间:2014-08-23 18:56:59

标签: java android http android-asynctask

我是Java的初学者,也是Android的编码员。当我编写一个发出一些网络请求的应用程序时,我收到了NetworkOnMainThreadException异常。我用Google搜索并找出原因和解决方案。但我还有一个问题。我的应用程序在不同的站点上发出请求,并将对响应执行不同的操作(首先响应登录操作,将检查,第二个操作是一些api调用,第三个操作是请求图像),我想我不应该为每种情况(doInBackground都是相同的,但不同的onPostExecute方法将在这里)。我该如何解决这个问题?感谢

3 个答案:

答案 0 :(得分:0)

你可以将一个aditional变量作为doInBackground Params传递,保存为" global"类变量并在onPostExecute中切换所以你不必创建3个不同的类

喜欢这个

public class Async_DL extends AsyncTask<String, String, String> {
    String type_of_request;
    String url;


    @Override
    protected void onPreExecute(){
    }

    @Override
    protected String doInBackground(String... params) {

        this.url = params[0];
        this.type_of_request = params[1];

        doinBackground stuff....
    }

    @Override
    protected void onPostExecute(String result) {
        switch(this.type_of_request){
            case a:
                do some stuff
            break;
        }
    }

}

答案 1 :(得分:0)

一种解决方案是创建一个像这样的接口回调

interface Callback { 
     public void call (String response); //or whatever return type you want
}

然后你可以像这样扩展你的AsyncTask类

private class HttpTask extends AsyncTask <Void,Void,String> {
     Callback callback;
     HttpTask (Callback callback) {
          this.callback = callback;
     }
     // your doInBackground method
     @Override
     protected void onPostExecute (String response) {
          callback.call(response);
     }
 }

然后你可以这样打电话给你AsyncTask

new HttpTask (new Callback () {
     @Override
     public void call (String response) { /* Here goes implementation */ }
}).execute();

答案 2 :(得分:0)

您不需要为每个动作制作三个单独的类。您只能在AsyncTask中扩展一次,我建议添加一个可以由您的活动实现的接口调用:

public interface RequestListener {

    public void onLoginCall();

    public void onApiCall();

    public void onImageCall();
}

同时创建一个枚举来保存请求&#39;类型:

public enum RequestType{

    LOGIN,
    API,
    IMAGE;
}

同时,您可以扩展AsyncTask并根据每种情况调用必要的侦听器方法。您可以使用第二个属性来保存请求的类型:

public class RequestTask extends AsyncTask<Object, RequestType, Object> {
    private RequestListener listener;


    @Override
    protected void onPreExecute(){
    }

    @Override
    protected String doInBackground(Object... params) {

        this.url = params[0];
        this.type_of_request = params[1];

        doinBackground stuff....
    }

    @Override
    protected void onPostExecute(Object result) {
       if(result is from login)
         listener.onLoginCall();
         ... and so on
    }

}