java - 如何同步从不同来源(设备缓存、Web 服务器和 sqlite 数据库)获取数据?
问题描述
新年快乐!我正在学习使用 java 进行 android 开发,我首先按照本教程使用架构组件创建我的第一个应用程序: 应用程序架构指南
我对android 架构设计和其他基本的东西有很好的理解。但是,我在处理后台任务时仍然存在问题,因为有许多类提供多线程,例如:Executor、IntentService和asynctask ..
我的代码:
存储库类:
public class MovieRpository { private IWebService m_webService; private Movie _movie; private AppExecuters m_executers; private MovieRpository(AppExecuters executers, TMDB webService){ this.m_executers = executers; this.m_webService = webService; } private static MovieRpository m_singleInstance; public static MovieRpository getInstance(){ if(m_singleInstance == null){ m_singleInstance = new MovieRpository(AppExecuters.getInstance(), new TMDB(new JsonParser<Movie>())); } return m_singleInstance; } public LiveData<Movie> getMovie( String movieId){ final MutableLiveData<Movie> _liveDataMovie = new MutableLiveData<Movie>(); m_executers.networkIO().execute(()->{ _movie =(Movie)m_webService.getObject(movieId);}); _liveDataMovie.setValue(_movie); return _liveDataMovie; } }
我的问题 :
在存储库类中,当我在由m_executers.networkIO() 创建的第二个线程内使用调试器时, _movie在网络线程内有一个值。但是,它在执行方法之外始终为 null。
我的其余代码:
- IWebService 接口
public interface IWebService<T> {
public T getObject(String url);
}
数据库:
public class TMDB implements IWebService<Movie> { private JsonParser<Movie> m_jsonParser; private Movie _movie; public TMDB(JsonParser<Movie> jsonParser){ m_jsonParser = jsonParser; } @Override public Movie getObject(String url) { try { HttpURLConnection _connection = (HttpURLConnection) (new URL(url)).openConnection(); _connection.setRequestMethod(Settings.CONNECTION_GET_METHOD); _connection.setConnectTimeout(Settings.CONNECTION_TIMEOUT); _connection.setReadTimeout(Settings.DATA_READ_TIMEOUT); _connection.connect(); InputStreamReader _streamReader = new InputStreamReader(_connection.getInputStream()); BufferedReader _bufferedReader = new BufferedReader(_streamReader); StringBuilder _data = new StringBuilder(); String _line; while((_line = _bufferedReader.readLine()) != null ){ _data.append(_line); } _bufferedReader.close(); _streamReader.close(); Gson _gson = new Gson(); _movie = _gson.fromJson(_data.toString(), Movie.class); } catch(MalformedURLException e) { e.printStackTrace(); } catch(IOException e){ e.printStackTrace(); } return _movie; } }
用于管理线程的 AppExecuters 单例类:
public class AppExecuters { private static AppExecuters m_singltonInstance; private Executor m_NetworkIO; private Executor m_diskIO; private Executor m_mainThread; private static final Object LOCK = new Object(); private AppExecuters(Executor diskThread, Executor networkThread, Executor mainThread){ this.m_diskIO = diskThread; this.m_mainThread = mainThread; this.m_NetworkIO = networkThread; } public static AppExecuters getInstance(){ if(m_singltonInstance == null){ // In-order to make the singleton instance synchronized between all threads. synchronized (LOCK){ m_singltonInstance = new AppExecuters(Executors.newSingleThreadExecutor(), Executors.newFixedThreadPool(3), new MainThread()); } } return m_singltonInstance; } public Executor networkIO(){ return m_NetworkIO; } public Executor diskIO(){ return m_diskIO; } public Executor mainThread(){ return m_mainThread; } private static class MainThread implements Executor{ private Handler mainThreadHandler = new Handler(Looper.getMainLooper()); @Override public void execute(Runnable command) { mainThreadHandler.post(command); } }
}
我还需要知道在这种情况下管理线程的最佳实践。
解决方案
推荐阅读
- docker - 如何在不同的代理上运行 Jenkins 并行柏树?
- python - Tensorflow - 如何使用批量维度执行 tf.gather
- sql - 在联接表中的 SQL 中为每个 id 返回一个结果
- azure-devops - 有没有办法判断用户是否是 azure devops 扩展 api 中的组织管理员
- sql - 当一个没有“分组依据”子句的聚合时会发生什么?
- ag-grid - agGrid:如何在将不可分组的列拖到行组面板后禁用隐藏它们?
- python - 如何获取具有groupby中最大值总和的数据框?
- java-7 - 客户端应用程序中的 TLS 版本不时更改,因为 SSLHandshakeException 发生
- r - R使用值而不是公式导入Excel文件(多张)
- c# - c# 按类型的属性对列表进行排序