gpt4 book ai didi

android - 如何在Android中添加HttpClient请求和连接超时

转载 作者:行者123 更新时间:2023-12-03 12:05:10 29 4
gpt4 key购买 nike

我正在开发我的第一个应用程序,并创建以下方法来连接到远程URL,获取JSON文件并将其写入本地SQLite数据库。有时会发生互联网连接缓慢或不良的情况,我会设置一个计时器。例如,如果3秒钟后没有得到JSON文件,我将抛出AlertDialog让用户选择是重试还是取消。那么如何在我的函数中添加超时呢?

public int storeData(Database db, int num) throws JSONException {

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("http://www.example.com/file.json");
request.addHeader("Cache-Control", "no-cache");
long id = -1;

try {
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
InputStreamReader in = new InputStreamReader(entity.getContent());
BufferedReader reader = new BufferedReader(in);
StringBuilder stringBuilder = new StringBuilder();
String line = "";

while ((line=reader.readLine()) != null) {
stringBuilder.append(line);
}

JSONArray jsonArray = new JSONArray(stringBuilder.toString());
SQLiteDatabase dbWrite = db.getWritableDatabase();
ContentValues values = new ContentValues();
if (jsonArray.length() == num && num != 0)
return num;
SQLiteDatabase dbread = db.getReadableDatabase();

for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jObj = (JSONObject) jsonArray.getJSONObject(i);

values.put("id", jObj.optString("id").toString());
values.put("name", jObj.optString("firstname").toString());
values.put("surname",jObj.optString("lastname").toString());

id = dbWrite.insert("users", null, values);
}
num = jsonArray.length();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (id > 0)
return num;
else
return -1;
}

最佳答案

需要考虑的几件事:

  • 套接字和HTTP连接超时

    首先,修改您的HTTP连接以使其具有连接和套接字超时
        BasicHttpParams basicParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout( basicParams, timeout * 1000 );
    HttpConnectionParams.setSoTimeout( basicParams, timeout * 1000 );
    DefaultHttpClient client = new DefaultHttpClient( basicParams );
  • 在超时时正常退出待处理请求
  • 如果响应数据很大,则在慢速连接上可能会用完时间,在这种情况下,我们需要正常关闭HTTPClient资源。
  • 我假设您已经在单独的线程中调用了这个storeData,我建议您使用use AsyncTask,因为我们可以在超时时使用call its cancel 方法。您的storeData代码将为in asyncTask's doInBackground ,在读取实体响应数据的“while”循环中,您可以检查isCancelled of AsyncTask并正常关闭
    if (isCancelled()) {
    EntityUtils.consume(entity);
    client.getConnectionManager().shutdown();
    return -1;
    }
  • 在asyncTask的postExecute函数中,可以将isDone设置为指示成功的请求,而无需任何超时和任何其他UI处理。
    protected void onPostExecute(...) {                
    isDone = true;
    }
  • 计划和处理主UI线程上的超时

    上面两个将处理连接超时,数据超时和慢速连接超时。现在,我们需要处理设置超时并通过UI进行管理。为此,我们可以使用@Neutrino建议的简单延迟的handler runnable
            boolean isDone = false;
    StoreDataTask storeDataTask = new StoreDataTask();
    storeDataTask.execute(...)
    new Handler().postDelayed(new Runnable() {
    public void run() {
    storeDataTask.cancel(false);
    }
    }, timeout * 1000);
    if (isDone) // we have a successful request without timeout

    将上述代码片段包装在一个函数中,如果用户想重试,则再次调用它。注意,如果用户不想等待超时而只想取消超时,则可以随时从onCreate或UI线程中调用storeDataTask.cancel(false);
  • 关于android - 如何在Android中添加HttpClient请求和连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26289773/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com