【问题标题】:HttpURLConnection and JSONParser simultaneous connectionHttpURLConnection 和 JSONParser 同时连接
【发布时间】:2013-08-01 20:13:22
【问题描述】:

我有一个使用 HttpURLConnection 使用 AsyncTask 上传文件的活动 (MainActivity)。这一切都很好,花花公子。我还有另一个活动(ListAllFilesActivity),它使用带有 makeHttpRequest 的 JSONParser 来查询 MySQL 数据库以获取已上传的所有文件的列表(也使用 AsyncTask)。 ListAllFilesActivity 活动也很有效。

我遇到的问题是,如果我从 MainActivity 开始为大文件上传文件,然后启动 ListAllFilesActivity 来查询数据库,则数据库查询将不会返回结果,直到 MainActivity 的 AsyncTask 完成上传文件(它只显示进度对话框,直到上传完成)。我猜这与等待“释放”连接有关。在 MainActivity 中上传文件时,是否可以连接并从 ListAllFilesActivity 获取结果?

不确定要显示什么代码,但这里有一些 sn-ps。如果您需要更多,请告诉我。

MainActivity.java

fileInputStream = new FileInputStream(fileToUpload);

// open a URL connection to the Servlet
// Open a HTTP connection to the URL
conn = (HttpURLConnection) url.openConnection();

// Allow Inputs
conn.setDoInput(true);
// Allow Outputs
conn.setDoOutput(true);
// Don't use a cached copy.
conn.setUseCaches(false);
// Use a post method.
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
if (Build.VERSION.SDK_INT > 13) {
    // Needed to add this since the second attempt to upload a file would fail with an EOFException and IOException: null
    // http://stackoverflow.com/questions/3352424/httpurlconnection-openconnection-fails-second-time
    conn.setRequestProperty("Connection", "close");
}
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
// String to get length to use for setFixedLengthStreamingMode
conn.setFixedLengthStreamingMode(infoSize);

ListAllFilesActivity.java

列表参数 = new ArrayList(); // 从 URL 获取 JSON 字符串

params.add(new BasicNameValuePair("access_token", mAccessToken));
params.add(new BasicNameValuePair("gplus_id", mGPlusId));
params.add(new BasicNameValuePair("id", mId));

JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params);

try {
    // Checking for SUCCESS TAG
    int success = json.getInt(TAG_SUCCESS);

    if (success == 1) {
        // Files found...dump them to HashMap
        // Getting Array of Products
    } 
} catch (JSONException e) {
    e.printStackTrace();
}

【问题讨论】:

    标签: android json httpurlconnection


    【解决方案1】:

    来自AsyncTask 的文档:

    首次引入时,AsyncTask 是在单个后台线程上串行执行的。从DONUT 开始,这已更改为允许多个任务并行运行的线程池。从HONEYCOMB开始,任务在单线程上执行,避免并行执行导致的常见应用错误。

    如果你真的想要并行执行,你可以用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor, Object[])

    【讨论】:

    • 谢谢 kabuko,很高兴知道。我没有想到这会成为 AsyncTask 的限制。我想一个后续问题是:我应该使用 Thread/Handler 代替文件上传(因为实际上没有 UI 依赖,可以这么说,当它完成上传时)和 AsyncTask 获取列表(因为它填充完成后的用户界面)?从用户体验的角度来看,在查看其他活动的列表之前不必等待文件上传完成会很好。我是researching,但第二个意见很好。
    • 您可能应该考虑这些上传的生命周期是否应该与 UI 相关联。鉴于您建议没有依赖关系并且这是一个相当长时间运行的任务,因此在 Service 中执行此操作可能是有意义的,可能使用 IntentService
    • 感谢您的洞察力!我会调查 IntentService。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2015-07-31
    相关资源
    最近更新 更多