我开发了一个应用程序,可以将手机拨打的所有电话保存到数据库中。这工作正常,因为一旦呼叫结束,我将获取所有呼叫详细信息并运行Web服务进行保存并保存呼叫。
但是,一旦没有网络连接或弱访问互联网,就会出现问题。呼叫未保存。 我找到了一条出路,我可以每天保存所有未保存的电话,这样我就能获得100%的电话通话记录。 我尝试在成功登录到hashmap后保存从服务器收到的表id,然后运行一个循环,服务将运行,直到找不到没有表id的日志,并且服务将在后台运行,Alarm Manager将运行在后台每24小时一次。这就是我做到的。
public class Senddata extends AsyncTask<String, Void, Void> {
String oppurjson;
String oppurerror = null;
ProgressDialog pd = new ProgressDialog(Create_log.this);
String oppurdata = "";
protected void onPreExecute() {
// NOTE: You can call UI Element here.
//Start Progress Dialog (Message)
pd.setMessage("Please wait..");
pd.show();
pd.setCancelable(false);
pd.setCanceledOnTouchOutside(false);
try {
if (sharedpreferences.contains(user)) {
idofuser = sharedpreferences.getString(user, "");
// System.out.println("Id of user is"+idofuser);
}
// Set Request parameter
oppurdata += "&" + URLEncoder.encode("user_id", "UTF-8") + "=" + idofuser;
oppurdata += "&" + URLEncoder.encode("call_start", "UTF-8") + "=" + calldatechange1;
oppurdata += "&" + URLEncoder.encode("duration", "UTF-8") + "=" + callDuration1;
oppurdata += "&" + URLEncoder.encode("direction", "UTF-8") + "=" + dir;
oppurdata += "&" + URLEncoder.encode("mob", "UTF-8") + "=" + ggg;
System.out.println("data going to be saved is-----" + oppurdata);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected Void doInBackground(String... urls) {
/************ Make Post Call To Web Server ***********/
BufferedReader reader = null;
// Send data
try {
// Defined URL where to send data
URL url = new URL(urls[0]);
// Send POST data request
URLConnection conn = url.openConnection();
conn.setConnectTimeout(15000);
conn.setReadTimeout(15000);
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(oppurdata);
wr.flush();
// Get the server response
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while ((line = reader.readLine()) != null) {
// Append server response in string
sb.append(line + " ");
}
// Append Server Response To Content String
oppurjson = sb.toString();
} catch (Exception ex) {
oppurerror = ex.getMessage();
} finally {
try {
reader.close();
} catch (Exception ex) {
}
}
/*****************************************************/
return null;
}
protected void onPostExecute(Void unused) {
// NOTE: You can call UI Element here.
// Close progress dialog
// pd.dismiss();
if (oppurerror != null) {
Toast.makeText(getApplicationContext(), "Unable to create the call log.Try Again later", Toast.LENGTH_LONG).show();
} else { // Show Response Json On Screen (activity)
Toast.makeText(getApplicationContext(), "Log created successfully", Toast.LENGTH_LONG).show();
String OutputData = "";
try {
//JSONObject jsonRootObject = new JSONObject(oppurjson);
JSONObject jsonRootObject = new JSONObject(oppurjson);
JSONObject json2 = jsonRootObject.getJSONObject("jsonobj");
callstable = json2.optString("calls_table_id").toString();
status = json2.optString("status").toString();
HashMap<String,String> hm=new HashMap<>();
hm.put("key",callstable);
System.out.println("the calls table is"+callstable +"and the status is"+status);
} catch (JSONException e) {
e.printStackTrace();
}
}
Create_log.this.finish();
moveTaskToBack(false);
}
}
我已将数据添加到hashmap,但它在那里返回错误,并且每次都不会添加数据。请建议我这是实现我想要实现的目标的最佳方式。如果是的话,我做错了什么?
答案 0 :(得分:0)
假设您在设备上存储时调用实体具有某种结构,我建议您为数据库中的每个调用实体添加一个syncStatus字段。 syncStatus可以是值“pendingSync”或“同步”。所有呼叫都应存储为“pendingSync”。然后实现一个syncadapter,它只是将带有pendingSync syncStatus的所有实体上传到您的Web服务,并且在成功上传每个实体后,将其本地状态更新为“synced”。但是当然你可以在这里阅读更多内容https://developer.android.com/training/sync-adapters/creating-sync-adapter.html那里也应该有一个教程。
前奏:请注意,如果您为应用程序实现了一个实际数据库,但我建议您查看Android上的其他持久性选项。我确实看到了你拥有的sharedpreferences变量,但这可能不是你正在做的最好的编码实践。我已经使用SQLite数据库来实现类似的目标。也许请阅读所有替代方案,哪些案例适合每个https://developer.android.com/guide/topics/data/data-storage.html
如果您是Android新手,最好的办法是为您正在学习的每个新功能创建一个新应用,并尽可能多地探索该功能,而不会被您想要实现的操作蒙蔽。