在 API 上发送并保存 SQLiteDatabase 的最佳方法是什么过程?
What process is the best way to send on API and save SQLiteDatabase?
我是 Android 的新手,正在开发一个大型应用程序,该应用程序将数据发送到 API 并将其保存在 SQlite 上。所有这些过程都在一个 class 文件中。但这让我犯了一个错误。有时设备挂起。另一种情况是数据不完整。我已经阅读了 Intent Service
和 Services
,我想了解这两者,但我想知道如何从 UI 获取我的所有数据并将其放在服务中。我可以知道如何吗?
这取决于应用程序的性质。如果这应该是响应用户输入而发生的……您可以使用 AsyncTask
。否则,后台服务也可以完成这项工作。
你永远不应该做的是 运行 在主 UI 线程上进行网络操作 and/or 数据库访问。
服务可以通过意图接收数据。发送这些意图的方式取决于服务的类型(Started、Bound 或两者)。您可以阅读大量资源...这是 Android 文档中的一个...
https://developer.android.com/guide/components/services
AsyncTask 示例
下面的示例显示了 AsyncTask
从网络资源中获取用户详细信息的实现...
public class FetchUserTask extends AsyncTask<String,Void, UserDTO> {
private FetchUserTaskListener listener;
@Override
protected UserDTO doInBackground(String...params){
if(params == null || params.length == 0)
return null;
String userID = params[0];
UserDataProvider provider = new UserDataProvider(userID);
try {
return provider.get(userID);
}
catch(Exception ex){
//log the error
return null;
}
}
@Override
protected void onPostExecute(UserDTO user){
if(listener != null)
listener.onCompleted(user);
}
public void setListener(FetchUserTaskListener listener){
this.listener = listener;
}
public interface FetchUserTaskListener{
void onCompleted(boolean success);
}
}
你是如何使用这个 AsyncTask 的?
例如,在 Activity
中,您可以如下使用它...
public class UserDetailsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
//instantiate activity...
super.onCreate(savedInstanceState);
setContentView(R.layout.whatever_layout);
fetchUser(userId);
}
private void fetchUser(String userID){
FetchUserTask task = new FetchUserTask();
task.setListener(new FetchUserTaskListener<UserDTO>() {
@Override
public void onCompleted(UserDTO user) {
//CAUTION: make sure the activity hasn't been stopped before
//accessing any UI elements and/or context
}
}
task.execute(userID);
}
}
备注
您可以(并且需要)使上面的示例更复杂一些。例如,如果发生错误,您可以让 FetchUserTaskListener
的 onCompleted
方法 return 也有一条错误消息。
在访问任何上下文绑定数据之前,您还需要检查 activity 是否已暂停或停止,否则您可能会遇到 ILlegalStateException。
利用 SQLiteOpenHelper class,它有一些方法可以通过扩展 SQLiteOpenHelper 在您自己的 class 中覆盖。根据您在此 class 中的要求创建添加、更新、删除、获取方法,并将此 class 保留为单例模式。用户 Asynctasks 调用这些方法,您就完成了。
希望能帮助您更好地形象化事物。
我是 Android 的新手,正在开发一个大型应用程序,该应用程序将数据发送到 API 并将其保存在 SQlite 上。所有这些过程都在一个 class 文件中。但这让我犯了一个错误。有时设备挂起。另一种情况是数据不完整。我已经阅读了 Intent Service
和 Services
,我想了解这两者,但我想知道如何从 UI 获取我的所有数据并将其放在服务中。我可以知道如何吗?
这取决于应用程序的性质。如果这应该是响应用户输入而发生的……您可以使用 AsyncTask
。否则,后台服务也可以完成这项工作。
你永远不应该做的是 运行 在主 UI 线程上进行网络操作 and/or 数据库访问。
服务可以通过意图接收数据。发送这些意图的方式取决于服务的类型(Started、Bound 或两者)。您可以阅读大量资源...这是 Android 文档中的一个...
https://developer.android.com/guide/components/services
AsyncTask 示例
下面的示例显示了 AsyncTask
从网络资源中获取用户详细信息的实现...
public class FetchUserTask extends AsyncTask<String,Void, UserDTO> {
private FetchUserTaskListener listener;
@Override
protected UserDTO doInBackground(String...params){
if(params == null || params.length == 0)
return null;
String userID = params[0];
UserDataProvider provider = new UserDataProvider(userID);
try {
return provider.get(userID);
}
catch(Exception ex){
//log the error
return null;
}
}
@Override
protected void onPostExecute(UserDTO user){
if(listener != null)
listener.onCompleted(user);
}
public void setListener(FetchUserTaskListener listener){
this.listener = listener;
}
public interface FetchUserTaskListener{
void onCompleted(boolean success);
}
}
你是如何使用这个 AsyncTask 的?
例如,在 Activity
中,您可以如下使用它...
public class UserDetailsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
//instantiate activity...
super.onCreate(savedInstanceState);
setContentView(R.layout.whatever_layout);
fetchUser(userId);
}
private void fetchUser(String userID){
FetchUserTask task = new FetchUserTask();
task.setListener(new FetchUserTaskListener<UserDTO>() {
@Override
public void onCompleted(UserDTO user) {
//CAUTION: make sure the activity hasn't been stopped before
//accessing any UI elements and/or context
}
}
task.execute(userID);
}
}
备注
您可以(并且需要)使上面的示例更复杂一些。例如,如果发生错误,您可以让 FetchUserTaskListener
的 onCompleted
方法 return 也有一条错误消息。
在访问任何上下文绑定数据之前,您还需要检查 activity 是否已暂停或停止,否则您可能会遇到 ILlegalStateException。
利用 SQLiteOpenHelper class,它有一些方法可以通过扩展 SQLiteOpenHelper 在您自己的 class 中覆盖。根据您在此 class 中的要求创建添加、更新、删除、获取方法,并将此 class 保留为单例模式。用户 Asynctasks 调用这些方法,您就完成了。
希望能帮助您更好地形象化事物。