0

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

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

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

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();
}
4

1 回答 1

3

AsyncTask的文档中:

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

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

于 2013-08-01T20:18:53.570 回答