【问题标题】:AsyncTask loading data in very different amount of times in androidAsyncTask在android中以非常不同的次数加载数据
【发布时间】:2018-09-05 04:37:37
【问题描述】:

我编写了这段代码来发送请求并从服务器获取数据。 有时使用 2G 互联网连接加载过程需要 2 秒,但有时使用 4G 互联网连接需要 20 多秒。 我必须考虑我没有考虑的任何事情吗?

这是我的代码

 @Override
protected void onPreExecute() {
    dialog.show();

    new CountDownTimer(10000, 10000) {
        public void onTick(long millisUntilFinished) {
        }

        public void onFinish() {
            // stop async task if not in progress
            if (getStatus() == Status.RUNNING) {
                Request.this.cancel(false);
                activity.finish();
                font.toast(activity.getResources().getString(R.string.connection_problem));

            }
        }
    }.start();

    super.onPreExecute();
}

@Override
protected String doInBackground(String... params) {
    if (isOnline())
        try {

            data += params[1];
            link += params[0];


            URL url = new URL(link);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.connect();

            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(httpURLConnection
                    .getOutputStream()));
            writer.write(data);
            writer.flush();

            int responseCode = httpURLConnection.getResponseCode();
            if (responseCode == 200) {//if valid, read result from server
                BufferedReader reader = new BufferedReader(new InputStreamReader
                        (httpURLConnection.getInputStream()));
                String line;
                StringBuilder stringBuilder = new StringBuilder();
                while ((line = reader.readLine()) != null) {
                    stringBuilder.append(line);
                }
                return stringBuilder.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    else {
        dialog.cancel();
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                font.toast(activity.getResources().getString(R.string.internet_connection_problem));
                activity.finish();
            }
        });

    }
    return null;
}


@Override
protected void onPostExecute(final String o) {
    try {
        if (o != null) {
            dialog.cancel();
            callBack.onResponse(new Response(o));
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    super.onPostExecute(o);
}
 public static boolean isOnline() {
    try {
        int timeoutMs = 2500;
        Socket sock = new Socket();
        SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);

        sock.connect(sockaddr, timeoutMs);
        sock.close();

        return true;
    } catch (IOException e) {
        return false;
    }
}

我使用 post 方法将请求发送到服务器(php),然后我收到结果。

我使用 isOnline 方法检查互联网连接,并在 onPerExecute 方法中使用 CountDownTimer 设置超时。

有没有办法加快连接速度? 如何防止加载时间差异很大?

【问题讨论】:

  • 可能它不依赖于您的应用程序。可能是互联网/服务器问题
  • 所以我的代码没有问题?
  • 我没有看到。但是您可以添加日志以至少查看您的代码的哪一部分花费了这么多时间——是连接检查,还是数据下载,或者其他什么
  • 感谢您提供信息,是否有可能我没有取消 asyncTask,因为我没有检查 isCancelled() 的返回值?所以它没有被取消,然后当我第二次调用它时会导致一些问题?

标签: java android multithreading android-asynctask connection


【解决方案1】:

这里只是一个建议,当然你可以无视我:)

为什么不用Retrofit -> https://square.github.io/retrofit/,真的很简单直观。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多