Android HttpURLConnection和JSONParser同时连接
我有一个活动(MainActivity),它使用HttpURLConnection使用AsyncTask上传文件。这一切都很顺利。我还有另一个活动(ListAllFilesActivity),它使用带有makeHttpRequest的JSONParser查询MySQL数据库中已上载的所有文件的列表(也使用AsyncTask)。ListAllFilesActivity活动也非常有效 我遇到的问题是,如果我从MainActivity启动一个大文件的文件上载,然后启动ListAllFilesActivity来查询数据库,则在MainActivity的AsyncTask完成文件上载之前,数据库查询不会返回结果(在上载完成之前,它只显示进度对话框)。我猜这与等待连接被“释放”有关。在MainActivity中上载文件时,是否有方法可以连接ListAllFilesActivity并从中获取结果 不确定到底要显示什么代码,但这里有一些代码片段。如果你需要更多,请告诉我 MainActivity.javaAndroid HttpURLConnection和JSONParser同时连接,android,json,httpurlconnection,Android,Json,Httpurlconnection,我有一个活动(MainActivity),它使用HttpURLConnection使用AsyncTask上传文件。这一切都很顺利。我还有另一个活动(ListAllFilesActivity),它使用带有makeHttpRequest的JSONParser查询MySQL数据库中已上载的所有文件的列表(也使用AsyncTask)。ListAllFilesActivity活动也非常有效 我遇到的问题是,如果我从MainActivity启动一个大文件的文件上载,然后启动ListAllFilesActiv
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
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);
List params=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();
}
从以下文件中: 首次引入时,异步任务是在单个后台线程上串行执行的。从
DONUT
开始,它被更改为一个线程池,允许多个任务并行运行。从蜂巢开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误
如果确实需要并行执行,可以使用THREAD\u POOL\u Executor
调用executeOnExecutor(java.util.concurrent.Executor,Object[])
从以下文件中: 首次引入时,异步任务是在单个后台线程上串行执行的。从
DONUT
开始,它被更改为一个线程池,允许多个任务并行运行。从蜂巢开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误
如果确实需要并行执行,可以使用THREAD\u POOL\u Executor
调用executeOnExecutor(java.util.concurrent.Executor,Object[])
谢谢歌舞伎,很高兴知道。我没有想到这会是AsyncTask的一个限制。我想接下来的问题是:我是否应该使用线程/处理程序来进行文件上传(因为上传完成后实际上没有UI依赖关系)和获取列表的AsyncTask(因为上传完成后会填充UI)?从用户体验的角度来看,在查看其他活动的列表之前,不必等待文件上传完成,这将是一件好事。我是,但是第二个观点很好。你应该考虑这些上传的生命是否应该与UI绑定在一起。考虑到您建议不存在依赖关系,而且这是一项相当长的运行任务,因此在
服务
中执行此操作可能是有意义的,可能需要使用IntentService
。感谢您的帮助!我会调查服务的。谢谢歌舞伎,很高兴知道。我没有想到这会是AsyncTask的一个限制。我想接下来的问题是:我是否应该使用线程/处理程序来进行文件上传(因为上传完成后实际上没有UI依赖关系)和获取列表的AsyncTask(因为上传完成后会填充UI)?从用户体验的角度来看,在查看其他活动的列表之前,不必等待文件上传完成,这将是一件好事。我是,但是第二个观点很好。你应该考虑这些上传的生命是否应该与UI绑定在一起。考虑到您建议不存在依赖关系,而且这是一项相当长的运行任务,因此在服务
中执行此操作可能是有意义的,可能需要使用IntentService
。感谢您的帮助!我会调查一下内部服务。