【问题标题】:Store all the information at once using Realm in Background thread Android在后台线程Android中使用Realm一次存储所有信息
【发布时间】:2017-09-12 08:25:03
【问题描述】:

我正在开发一个 android 应用程序,我在其中使用 Relam 作为本地数据库。我有一个用于所有用户信息的休息 api,另一个用于新闻信息。我有两个按钮。一个用于显示用户信息,另一个用于显示新闻信息。现在,用我的代码完成了什么,登录后,我需要首先点击相应的用户信息和新闻信息的按钮,然后我才能看到那些图像和新闻。但如果我关闭连接,则在登录后,数据不会显示在视图中。我正在详细解释我的代码。此外,我在加载图像时遇到了问题。我怎样才能使功能性,以便用户可以在登录后获取所有信息。对于这么长的代码,我真的很抱歉。如果有人告诉我如何修改代码以将所有数据存储在后台线程中,这对我真的很有帮助,以便用户在登录后立即获得所有信息。

我要开始的登录页面部分

private void loginUser(final String mEmail, final String mPassword) {

    final GlobalClass globalClass = new GlobalClass();
    globalClass.setEmail_info( mEmail );

    setFilePath();

    RequestQueue queue = Volley.newRequestQueue( LoginPage.this );

    StringRequest strReq = new StringRequest( Request.Method.POST,
            LOGIN_URL, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            Log.d( TAG, "Register Response: " + response.toString() );

            //parse your response here
            if (response.contains( "overview" )) {
                showProgress( true );

                globalClass.setImage_urlpath( Constants.HTTP.PHOTO_URL + mEmail);
                String str = globalClass.readDatafromStorage();
                Log.d("----After Login---",str);

               if ( !str.contains("ACTIVATE") ) {
                   Log.d( "----After Login---", "After Login" );

                }

                SharedPreferences.Editor editor = sharedpreferences.edit();
                editor.putString(KEY_EMAIL, mEmail);
                editor.putString(KEY_PASSWORD, mPassword);
                editor.commit();

                showProgress(false);
                Intent loginIntent = new Intent(LoginPage.this, MainOptionPage.class);
                loginIntent.putExtra(KEY_EMAIL, mEmail);
                startActivity(loginIntent);

            } else {
                userEmail.setError(getString(R.string.error_incorrect_login));
                userEmail.requestFocus();

            }
        }

    }, new Response.ErrorListener() {
        @Override
       ....

这是我的用户页面代码

    public class MyColleaguesPage extends AppCompatActivity implements ColleagueController.UserCallbackListener {

     private List<MyColleagueModel> myColleagueList = new ArrayList<>();

    private Realm colleagueRealm;
    private RealmResults<MyColleagueModel> colleagueResult;

    private List<MyColleagueModel> filteredModelList;
    private RealmChangeListener realmListener;
    private static final String DIALOG_TAG = "EmployeeDialog";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mycolleagues_layout);



        configViews();

    }

    private void configViews() {
        recyclerView = this.findViewById(R.id.colleagues_recycler);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(MyColleaguesPage.this));
        recyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());

        colleagueRealm = Realm.getDefaultInstance();

        RealmResults<MyColleagueModel> results = colleagueRealm.where(MyColleagueModel.class).findAll();

        for (int i = 0; i < results.size(); i++) {

            myColleagueList.add(results.get(i));
        }
        adapter = new MyColleaguesAdapter(myColleagueList,getApplicationContext());
        //adapter = new MyColleaguesAdapter(myColleagueList,getApplicationContext());
        Log.d( "adapter value is"+"", String.valueOf( adapter ) );
        recyclerView.setAdapter(adapter);
    }


    //successful
    @Override
    public void onFetchStart() {

    }

    @Override
    public void onFetchProgress(ColleagueModel colleague) {
        //adapter.addColleague(colleague);
    }

    @Override
    public void onFetchProgress(List<ColleagueModel> colleagueList) {

    }

    @Override
    public void onFetchComplete() {

    }

    @Override
    public void onFetchFailed() {

    }
   }

这是我同事页面的控制器类

    public class ColleagueController {

    private static final String TAG = ColleagueController.class.getSimpleName();
    private UserCallbackListener mListener;
    private ColleagueResApiManager mApiManager;


    Realm myColleague_realm;    
    public ColleagueController() {
        mApiManager = new ColleagueResApiManager();
    }


public void startFetching(){
    myColleague_realm = Realm.getDefaultInstance();

    mApiManager.getColleagueApi().getColleague(new Callback<String>() {
        @Override
        public void success(String s, Response response) {
            Log.d(TAG, "JSON :: " + s);
            try {
                JSONArray array = new JSONArray(s);

                for(int i = 0; i < array.length(); i++) {
                    JSONObject object = array.getJSONObject(i);
                    Log.d("-----Start Fetching---", object.optString( "name" ));

                        myColleague_realm.beginTransaction();
                        MyColleagueModel mycolleague = myColleague_realm.createObject( MyColleagueModel.class );

                       mycolleague.setName( object.optString( "name" ) );
                       .... data  ) );



                    myColleague_realm.commitTransaction();

                }

            } catch (JSONException e) {
                mListener.onFetchFailed();
            }

           // mListener.onFetchComplete();
        }
        @Override
        public void failure(RetrofitError error) {
            Log.d(TAG, "Error :: " + error.getMessage());
            if (mListener != null) {
                mListener.onFetchComplete();
            }
        }
    });

}




    public interface UserCallbackListener{

        void onFetchComplete();
        void onFetchFailed();
    }
}

以同样的方式,我有其他页面新闻选项页面,我在其中显示新闻数据。这是我的新闻页面。

    public class NewsPage extends AppCompatActivity{

    private RecyclerView recyclerView;
    private NewsAdapter adapter;
    private Realm newsRealm;


    private List<NewsRealmModel> mNewsList;
    private List<NewsRealmModel> filteredModelList;

    private NewsController mController;

    Constant constant;
    SharedPreferences app_preferences;
    int appTheme;
    int themeColor;
    int appColor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView( R.layout.news_page_layout);



        configViews();

    }

    private void configViews() {
        recyclerView = this.findViewById(R.id.news_recycler);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(NewsPage.this));
        recyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());

        Realm newsRealm = Realm.getDefaultInstance();
        RealmResults<NewsRealmModel> temp = newsRealm.where(NewsRealmModel.class).findAll();
        mNewsList = new ArrayList<>();
        for (int i = 0; i < temp.size(); i++) {

            mNewsList.add(temp.get(i));
        }

        adapter = new NewsAdapter(mNewsList,getApplicationContext());
        Log.d( "adapter value is"+"", String.valueOf( adapter ) );
        recyclerView.setAdapter(adapter);
     }


   } 

还有新的控制器类

public class NewsController {
private static final String TAG = NewsController.class.getSimpleName();
private UserCallbackListener mListener;
private NewsRestApiManager mApiManager;
private AppImage appImages;

Realm myNews_realm;
ArrayList<String> title_list = new ArrayList<>();
GlobalClass globalClass = new GlobalClass();

public NewsController(UserCallbackListener listener) {
    mListener = listener;
    mApiManager = new NewsRestApiManager();
}


public void startFetching() {
    myNews_realm = Realm.getDefaultInstance();
    mApiManager.getNewsApi().getNews(new Callback<String>() {

        @Override
        public void success(String s, Response response) {
            Log.d(TAG, "JSON :: " + s);

            try {
                JSONArray array = new JSONArray(s);

                for (int i = 0; i < array.length(); i++) {
                    JSONObject jsonObject = array.getJSONObject(i);
                    Log.d("-----Start Fetching---", jsonObject.optString("title"));

                    if (!myNews_realm.isInTransaction()) {

                        myNews_realm.beginTransaction();

                        NewsRealmModel news = new NewsRealmModel();
                       ....... data 
                        }

                        myNews_realm.copyToRealm(news);
                        myNews_realm.commitTransaction();

                        mListener.onFetchProgressNews(news);

                    } else {
                        myNews_realm.commitTransaction();
                    }


                }
            } catch (JSONException e) {
                mListener.onFetchFailed();
            }

            mListener.onFetchComplete();
        }

        @Override
        public void failure(RetrofitError error) {
            Log.d(TAG, "Error :: " + error.getMessage());
            mListener.onFetchComplete();
        }
    });

}
public interface UserCallbackListener {


    void onFetchProgressNews(NewsRealmModel news);



    void onFetchComplete();

    void onFetchFailed();
}

}

【问题讨论】:

  • 你为什么有List&lt;MyColleagueModel&gt; filteredModelList;?您正在使用数据库,以便您可以使用数据库来过滤事物。
  • @EpicPandaForce 我有用户过滤的模型列表,用于搜索列表,但我没有在那里提供此代码。但是我所面临的下载不是在后台线程中完成的,一旦我点击按钮,数据就会开始下载,因此,当内部连接关闭时,用户没有得到信息
  • 因为您有一个 ArrayList 来填充而不是使用 RealmResults 并更改侦听器。你看到any ArrayList in the documentation? Because I sure don't。查看更多文档here
  • @EpicPandaForce 你说的是控制器类还是主要活动类中的数组列表

标签: android multithreading realm realm-mobile-platform background-thread


【解决方案1】:

要使用 Volley 在后台线程上进行数据库处理,您需要扩展 Request&lt;T&gt; 并在 parseNetworkResponse 方法中执行 Realm 写入。

public class RealmGsonObjectRequest<T, M extends RealmModel> extends Response<Void> {
  ...
  @Override
  protected Response<Void> parseNetworkResponse(
                            NetworkResponse response) {
    try {
      String json = new String(response.data,
          HttpHeaderParser.parseCharset(response.headers));
      T data = gson.fromJson(json, clazz);

      // write the downloaded data into the Realm on bg thread
      try(Realm r = Realm.getDefaultInstance()) {
        M model = mapper.toModel(data);
        r.executeTransaction((realm) -> {
          realm.insertOrUpdate(model);
        });
      }

      return Response.success(null,
         HttpHeaderParser.parseCacheHeaders(response)
      );
    } // handle errors
}

您可能还需要RealmGsonListRequest

public class RealmGsonListRequest<T, M extends RealmModel> extends Response<Void> {
  ...
  @Override
  protected Response<Void> parseNetworkResponse(
                            NetworkResponse response) {
    try {
      String json = new String(response.data,
          HttpHeaderParser.parseCharset(response.headers));
      List<T> data = gson.fromJson(json, new TypeToken<ArrayList<T>>() {}.getType());

      // write the downloaded data into the Realm on bg thread
      try(Realm r = Realm.getDefaultInstance()) {
        M model = mapper.toModel(data);
        r.executeTransaction((realm) -> {
          realm.insertOrUpdate(model);
        });
      }

      return Response.success(null,
         HttpHeaderParser.parseCacheHeaders(response)
      );
    } // handle errors
}

有关详细信息,请参阅official Volley tutorial on how to create a custom Volley request type

【讨论】:

  • 谢谢你的回答,我会试试这个,让你知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
相关资源
最近更新 更多