哪个过程是发送API并保存SQLiteDatabase的最佳方法?

时间:2018-08-06 02:35:17

标签: android sqlite service intentservice

我是Android上的新手,正在使用一个大型应用程序,该应用程序已将数据发送到API并将其保存在SQlite上。所有这些过程都在一个类文件中。但这让我犯了一个错误。有时设备挂起。其他情况是数据不完整。我已经读过final abstract class Unit private extends AnyVal { // Provide a more specific return type for Scaladoc override def getClass(): Class[Unit] = ??? } Intent Service的内容,并且想了解两者,但是我想知道如何从UI中获取所有数据并将其放在服务上。我可以知道吗?

2 个答案:

答案 0 :(得分:2)

这取决于应用程序的性质。如果应用户输入而发生这种情况...您可以使用AsyncTask。否则,后台服务也可以完成这项工作。

您永远不应该在主UI线程上运行网络操作和/或数据库访问。

服务可以通过意图接收数据。发送这些意图的方式取决于服务的类型(已启动,已绑定或两者)。有很多资源可供您阅读...这是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的{​​{1}}方法返回一条错误消息。

在访问任何上下文绑定数据之前,您还需要检查活动是否已暂停或停止,否则可能会收到ILlegalStateException。

答案 1 :(得分:0)

使用SQLiteOpenHelper类,通过扩展SQLiteOpenHelper,它具有在您自己的类中重写的方法。根据您在此类中的要求创建Add,Update,Delete,Get方法,并将该类保持为Singleton模式。用户Asynctasks调用这些方法,您就完成了。

希望可以更好地可视化事物。