我有一个活动(MainActivity),它使用HttpURLConnection来使用AsyncTask上传文件。一切都很好很好。我还有另一个活动(ListAllFilesActivity),它使用带有makeHttpRequest的JSONParser查询MySQL数据库,以获取已上载的所有文件的列表(也使用AsyncTask)。ListAllFilesActivity活动也非常有效。
我遇到的问题是,如果我从MainActivity开始一个大文件的文件上载,然后启动ListAllFilesActivity来查询数据库,数据库查询将不会返回结果,直到AsyncTask MainActivity已经完成上传文件(它只是显示进度对话框,直到上传完成)。我猜这与等待连接“释放”有关。当一个文件被上传到ListAllFilesActivity中时,是否有一种方法可以连接并获取MainActivity的结果?
不确定具体要显示什么代码,但是这里有一些代码片段。如果你需要更多,请告诉我。
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
List params =();//从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();
}发布于 2013-08-01 20:18:53
来自AsyncTask的文档
当第一次引入时,AsyncTasks是在单个后台线程上串行执行的。从
DONUT开始,它被更改为一个线程池,允许多个任务并行操作。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。 如果您确实希望并行执行,则可以使用executeOnExecutor(java.util.concurrent.Executor, Object[])调用THREAD_POOL_EXECUTOR。
https://stackoverflow.com/questions/18003652
复制相似问题