Android 如何减少HTTPURLConnection代码

Android 如何减少HTTPURLConnection代码,android,Android,已解决: 我已经使用了翻新库的建议,它减少了我的代码分配。谢谢您的帮助。 我有一个android应用程序,在页面上,当有人点击开关时,我会在下面显示代码,它将使用PUT将数据作为JSON发送到服务器。然而,我不知道我如何才能减少这段代码,使我可以再次使用它。我不想继续复制和粘贴相同的代码,更改请求方法或我正在写入的字节类型 这是我的oncreate中的代码,当开关打开时,它将执行图B中的操作。我希望在开关关闭时将其删除,而不必从图B复制相同的代码并进行更改,然后执行它。 test.setOnCl

已解决: 我已经使用了翻新库的建议,它减少了我的代码分配。谢谢您的帮助。

我有一个android应用程序,在页面上,当有人点击开关时,我会在下面显示代码,它将使用PUT将数据作为JSON发送到服务器。然而,我不知道我如何才能减少这段代码,使我可以再次使用它。我不想继续复制和粘贴相同的代码,更改请求方法或我正在写入的字节类型

这是我的oncreate中的代码,当开关打开时,它将执行图B中的操作。我希望在开关关闭时将其删除,而不必从图B复制相同的代码并进行更改,然后执行它。

test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            boolean on = ((Switch) v).isChecked();
            if(on)
            {
                //Do something when switch is on/checked
                new RetrieveFeedTask().execute();
                new newtask().execute();

            }
            else
            {
                //Do something when switch is off/unchecked

            }
        }
    });
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.post("https://www.google.com", params, new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
    }
});
dependencies {
  compile 'com.loopj.android:android-async-http:1.4.9'
}
图B

class RetrieveFeedTask extends AsyncTask<String, String, String> {

 private Exception exception;


 protected String doInBackground(String... urls) {

 URL url = null;
 try {
     String strUrl = "http://192.168.0.104:5053/TEST";
     url = new URL(strUrl);
     HttpURLConnection connection = (HttpURLConnection) url.openConnection();

     connection.setRequestMethod("POST");
     connection.setRequestProperty("Content-Type", "application/json; charset");
     connection.setDoInput(true);
     connection.setDoOutput(true);

     OutputStream stream = connection.getOutputStream();
     DataOutputStream writer = new DataOutputStream(stream);
     connection.connect();
     //Log.d("WARN", "TEST");
     // The LogCat prints out data like:
     // ID:test,Email:test@gmail.com,Pwd:test
    String suuid = UUID.randomUUID().toString();

     writer.writeBytes("{\"id\" : \""+suuid+ "\", \"sensorType\" : \"sound\", \"threshold\" : \"50\", \"operator\" : \">\", \"actuator\" : \"1\", \"actuatorAction\" : \"4\"}");
     writer.flush();
     writer.close();

     InputStream response = connection.getInputStream();
     StringBuilder sb = new StringBuilder();
     BufferedReader bf = new BufferedReader(new InputStreamReader(response, "utf-8"));
     String responseLine = bf.readLine();
     while(responseLine != null) {
         sb.append(responseLine);
         responseLine = bf.readLine();
     }

     stream.close();
     System.out.println("executed");
     connection.disconnect();



 } catch (IOException e) {
     e.printStackTrace();
 }
 return "fff";
 }

 protected String onPostExecute() {
 // TODO: check this.exception
 // TODO: do something with the feed
 return "ASDASD";
 }



 }
class RetrieveFeedTask扩展了AsyncTask{
私人例外;
受保护的字符串doInBackground(字符串…URL){
URL=null;
试一试{
字符串strUrl=”http://192.168.0.104:5053/TEST";
url=新url(strUrl);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setRequestMethod(“POST”);
setRequestProperty(“内容类型”、“应用程序/json;字符集”);
connection.setDoInput(true);
connection.setDoOutput(真);
OutputStream=connection.getOutputStream();
DataOutputStream编写器=新的DataOutputStream(流);
connection.connect();
//日志d(“警告”、“测试”);
//LogCat打印出如下数据:
//ID:测试,电子邮件:test@gmail.com,Pwd:测试
字符串suuid=UUID.randomUUID().toString();
writer.writeBytes(“{\'id\”:\\'+suuid+“\”,“sensorType\”:“sound\”,“threshold\”:“50\”,“operator\”:\“>”,“actuatorAction\”:“1\”,“actuatorAction\”:“4\”);
writer.flush();
writer.close();
InputStream响应=connection.getInputStream();
StringBuilder sb=新的StringBuilder();
BufferedReader bf=新的BufferedReader(新的InputStreamReader(响应,“utf-8”));
字符串responseLine=bf.readLine();
while(responseLine!=null){
某人附加(应答线);
responseLine=bf.readLine();
}
stream.close();
系统输出打印项次(“已执行”);
连接断开();
}捕获(IOE异常){
e、 printStackTrace();
}
返回“fff”;
}
受保护的字符串onPostExecute(){
//TODO:检查此项。异常
//TODO:对提要做些什么
返回“ASDASD”;
}
}
如果需要更清楚的信息,请告诉我。

使用

示例代码:

test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            boolean on = ((Switch) v).isChecked();
            if(on)
            {
                //Do something when switch is on/checked
                new RetrieveFeedTask().execute();
                new newtask().execute();

            }
            else
            {
                //Do something when switch is off/unchecked

            }
        }
    });
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.post("https://www.google.com", params, new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
    }
});
dependencies {
  compile 'com.loopj.android:android-async-http:1.4.9'
}
Gradle:

test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            boolean on = ((Switch) v).isChecked();
            if(on)
            {
                //Do something when switch is on/checked
                new RetrieveFeedTask().execute();
                new newtask().execute();

            }
            else
            {
                //Do something when switch is off/unchecked

            }
        }
    });
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.post("https://www.google.com", params, new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
    }
});
dependencies {
  compile 'com.loopj.android:android-async-http:1.4.9'
}
使用

示例代码:

test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            boolean on = ((Switch) v).isChecked();
            if(on)
            {
                //Do something when switch is on/checked
                new RetrieveFeedTask().execute();
                new newtask().execute();

            }
            else
            {
                //Do something when switch is off/unchecked

            }
        }
    });
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.post("https://www.google.com", params, new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
    }
});
dependencies {
  compile 'com.loopj.android:android-async-http:1.4.9'
}
Gradle:

test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            boolean on = ((Switch) v).isChecked();
            if(on)
            {
                //Do something when switch is on/checked
                new RetrieveFeedTask().execute();
                new newtask().execute();

            }
            else
            {
                //Do something when switch is off/unchecked

            }
        }
    });
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.post("https://www.google.com", params, new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
    }
});
dependencies {
  compile 'com.loopj.android:android-async-http:1.4.9'
}

为此,您可以使用非常轻量级的离子库。Github上有使用示例:

您可以为此使用非常轻量级的离子库。Github上有使用示例:

Android Volley(已弃用): 或

改装:

test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            boolean on = ((Switch) v).isChecked();
            if(on)
            {
                //Do something when switch is on/checked
                new RetrieveFeedTask().execute();
                new newtask().execute();

            }
            else
            {
                //Do something when switch is off/unchecked

            }
        }
    });
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.post("https://www.google.com", params, new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
    }
});
dependencies {
  compile 'com.loopj.android:android-async-http:1.4.9'
}
  • 类型安全HTTP客户端
  • 就易用性、性能、捕获、可扩展性、多部分上传和其他方面而言,改型无疑是凌空截击的更好选择。它是一个类型安全的REST客户端 ()

安卓截击(已弃用): 或

改装:

test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            boolean on = ((Switch) v).isChecked();
            if(on)
            {
                //Do something when switch is on/checked
                new RetrieveFeedTask().execute();
                new newtask().execute();

            }
            else
            {
                //Do something when switch is off/unchecked

            }
        }
    });
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.post("https://www.google.com", params, new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
    }
});
dependencies {
  compile 'com.loopj.android:android-async-http:1.4.9'
}
  • 类型安全HTTP客户端
  • 就易用性、性能、捕获、可扩展性、多部分上传和其他方面而言,改型无疑是凌空截击的更好选择。它是一个类型安全的REST客户端 ()

首先,我建议使用网络库(改型、Volly等),因为直接处理http连接有点复杂,而且容易出错,而这些库可能已经解决了这些问题

但是,如果您仍然希望直接使用http连接,您可以创建一个httpConnection任务来扩展异步任务,并在创建时获取必要的参数

比如说-

public class HttpConnection extends AsyncTask<String, String, String> {

private final String mBytes;
private final String mMethod;

public HttpConnection(String method, String bytes) {
    mMethod = method;
    mBytes = bytes;
}

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

    // ... open connection
    writer.writeBytes(mBytes);
    return null;
}
公共类HttpConnection扩展异步任务{
专用最终字符串MB;
私有最终字符串方法;
公共HttpConnection(字符串方法,字符串字节){
M方法=方法;
MB=字节;
}
@凌驾
受保护的字符串背景(字符串…字符串){
//…开放连接
writer.writeBytes(MB);
返回null;
}

显然,您可以将其更改为使用您想要/需要的任何参数。首先,我建议使用网络库(改型、Volly等),因为直接处理http连接要复杂一些,并且容易出现库可能已经解决的错误

但是,如果您仍然希望直接使用http连接,您可以创建一个httpConnection任务来扩展异步任务,并在创建时获取必要的参数

比如说-

public class HttpConnection extends AsyncTask<String, String, String> {

private final String mBytes;
private final String mMethod;

public HttpConnection(String method, String bytes) {
    mMethod = method;
    mBytes = bytes;
}

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

    // ... open connection
    writer.writeBytes(mBytes);
    return null;
}
公共类HttpConnection扩展异步任务{
专用最终字符串MB;
私有最终字符串方法;
公共HttpConnection(字符串方法,字符串字节){
M方法=方法;
MB=字节;
}
@凌驾
受保护的字符串背景(字符串…字符串){
//…开放连接
writer.writeBytes(MB);
返回null;
}

显然,您可以将其更改为使用您想要/需要的任何参数。

建议使用。对于每个活动维护一个或多个异步任务,我没有什么大问题。预处理和后处理步骤通常不同,如果仔细分析,您可能会发现大部分代码是不同的。@ADM谢谢,我已经使用了retro调整并减少代码分配。我不知道如何让你的答案成为答案,但我非常感谢你。建议使用。我对每个活动维护一个或多个异步任务没有什么大问题。前后步骤通常是不同的,如果你仔细分析,你可能会发现大部分代码是不同的。@ADM谢谢你,我知道了