1

我有一个类,我用它来将我的应用程序中的统计信息发送到网站。有多种方法可以满足我要发送的不同类型的数据,代码摘录在这里:

public class TransmitMetrics {
private final String request = "http://192.168.0.60/post.php";
private String function;
private URL url;
private HttpURLConnection connection;
private String line;
private String urlParameters;

public void updatePhone(String device_id, String country) {

    String make = Build.MANUFACTURER;
    String model = Build.MODEL;
    String sdk = Build.VERSION.SDK;

    function = "phoneupdate";
    urlParameters = "function=" + function + "&device_id=" + device_id
            + "&make=" + make + "&model=" + model + "&country=" + country
            + "&sdk=" + sdk;

    new sendData().execute();
}

然后我有一个嵌套的 AsyncTask 类(sendData),它处理不能在 mainUI 线程上运行的 HTTPURLConnection 东西,这里的部分代码:

private class sendData extends AsyncTask<Void, Void, Integer> {
    @Override
    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);
                   //Proposed DB stuff here based on return code
                   //stored in the result variable.
    }

    @Override
    protected Void doInBackground(Void... arg0) {

        try {
            url = new URL(request);
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        }

        try {
            connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setInstanceFollowRedirects(false);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            connection.setRequestProperty("charset", "utf-8");
            connection.setRequestProperty("Content-Length",
                    "" + Integer.toString(urlParameters.getBytes().length));
            connection.setUseCaches(false);

            DataOutputStream wr = new DataOutputStream(
                    connection.getOutputStream());
            wr.writeBytes(urlParameters);
            wr.flush();

我对代码没有任何问题,它工作正常,但是,我最近一直在尝试通过添加依赖于从 HttpURLConnection 返回的响应代码的数据库更新来改进应用程序。
onPostExecute() 是标准方法,但我不确定是否应该开始声明数据库连接并从 onPostExecute() 方法中执行数据库更新。

如果有更好的方法可以做到这一点,或者我不应该首先使用 AsyncTask 来实现这种类型的功能,我想要一些建议。

4

3 回答 3

0

是的,您可以使用 httpurlconnection 中的 responsebody。我认为你没有使用 json 从服务器发送或接收数据。最好使用 json 格式,这有助于从服务器端以对象形式或数组形式获取数据。

于 2013-06-26T18:54:34.353 回答
0

作为第一个注释,我相信您应该有一个单独的类来执行数据库操作,因为您的代码对于一个类来说太复杂了。它似乎已经打破了单一职责原则。我会将当前的 Http 操作移动到一个新类。此外,保留对 URL、HttpURLConnection 和参数的类引用也不安全,因为您可能同时有 2 个正在运行的请求,并且共享这些属性会导致意外结果。

回到您的问题,假设sendData.execute(...)在 UI 线程上启动,那么 onPostExecute(Integer) 也将在 UI 线程上运行。DB 操作应该在非 UI 线程上执行,因为您不知道您的数据库将“在野外”增长多大。因此,您可以在另一个 AsyncTask 上移动数据库操作 - 如果您需要数据库操作结果。否则一个简单的后台线程就足够了。

于 2013-06-26T19:52:14.713 回答
0

您可以使用 Aynctask 执行任何执行其他操作的任务,并且您希望在 UI 上执行该操作的结果。举个例子,您可以使用 asyntask 在 onBackground 方法中执行一些数据库和游标操作,并在 onPostExecute 方法中更新数据,同样规则可以应用于任何非 UI 操作。

于 2013-06-26T19:12:15.897 回答