我有一个课程,用于将我的应用程序中的统计信息发送到网站。有多种方法可以满足我想要发送的不同类型的数据,代码提取在这里:
public class TransmitMetrics {
private final String request = "http://192.168.0.60/post.php";
private String function;
private URL url;
private HttpURLConnection connection;
private String line;
private String urlParameters;
public void updatePhone(String device_id, String country) {
String make = Build.MANUFACTURER;
String model = Build.MODEL;
String sdk = Build.VERSION.SDK;
function = "phoneupdate";
urlParameters = "function=" + function + "&device_id=" + device_id
+ "&make=" + make + "&model=" + model + "&country=" + country
+ "&sdk=" + sdk;
new sendData().execute();
}
然后我有一个嵌套的AsyncTask类(sendData)来处理无法在mainUI线程上运行的HTTPURLConnection东西,这里是代码的一部分:
private class sendData extends AsyncTask<Void, Void, Integer> {
@Override
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
//Proposed DB stuff here based on return code
//stored in the result variable.
}
@Override
protected Void doInBackground(Void... arg0) {
try {
url = new URL(request);
} catch (MalformedURLException e1) {
e1.printStackTrace();
}
try {
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length",
"" + Integer.toString(urlParameters.getBytes().length));
connection.setUseCaches(false);
DataOutputStream wr = new DataOutputStream(
connection.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
我对代码没有任何问题,它运行正常,但是,我最近一直在尝试通过添加依赖于HttpURLConnection返回的响应代码的数据库更新来改进应用程序。
onPostExecute()是标准方法,但我不确定是否应该从onPostExecute()方法开始声明数据库连接并执行db更新。
如果有更好的方法,我想要一些建议,或者我不应该首先使用AsyncTask来实现这种功能。
答案 0 :(得分:0)
是的,你可以使用httpurlconnection中的responsebody。我认为你不使用json从服务器发送或接收数据。最好使用json格式,它有助于以对象形式获取数据或从服务器端获取数组。
答案 1 :(得分:0)
您可以使用Aynctask执行执行某些其他操作的任何任务,并且您希望在UI上执行该操作的结果。让我们举例说明,您可以使用asyntask在onBackground方法中执行某些数据库和游标操作,并在onPostExecute中更新数据方法,相同的规则可以应用于任何非UI操作。
答案 2 :(得分:0)
作为第一个注释,我相信您应该有一个单独的类来执行数据库操作,因为您的代码对于类来说太复杂了。它似乎已经打破了Single-Responsibility Principle。我会将当前的Http操作移动到一个新类。此外,保持对URL,HttpURLConnection和参数的类引用是不安全的,因为您可能同时有2个正在运行的请求,并且共享这些属性会导致意外结果。
回到你的问题,假设在UI线程上启动了sendData.execute(...)
,那么onPostExecute(Integer)也将在UI线程上运行。数据库操作应该在非UI线程上执行,因为您不知道您的数据库“在野外”会有多大。因此,您可以在另一个AsyncTask上移动数据库操作 - 如果您需要数据库操作结果。否则,简单的后台线程就足够了。