为了在Android上使用mvp模式实现"干净"架构,建议将android框架视为插件,而不是将任何知识产权感知依赖项泄漏到演示者层.使用rxjava,如果我有一个用于将数据"推送"到视图层的演示者,我可能希望有这样的逻辑:
public interface SearchPresenter {
interface ViewLayer {
void updateResults(List<SearchResult> searchResults)
}
void bind(ViewLayer viewLayer);
void unbind();
}
public class SearchPresenterImpl implements SearchPresenter {
ViewLayer viewLayer;
CompositeDisposable compositeDisposable;
@Override
public void bind(ViewLayer viewLayer) {
this.viewLayer = viewLayer;
compositeDisposable = new CompositeDisposable();
compositeDisposable.add(
searchInteractor.getSearchResults()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::refreshView));
}
private void refreshView(List<SearchResult> searchResults) {
//send the results back to the view layer to update a RecyclerView
viewLayer.updateResults(searchResults)
}
@Override
public void unbind() {
compositeDisposable.dispose();
}
Run Code Online (Sandbox Code Playgroud)
但是,通过观察'AndroidSchedulers.mainThread()',这会强制依赖于:
import io.reactivex.android.schedulers.AndroidSchedulers
Run Code Online (Sandbox Code Playgroud)
在这一点上,我的主持人现在知道android并且与之相关; 我想避免.
处理这个的建议方法是什么,以保证结果在Android的UI(主)线程上传递给ViewLayer,而演示者维护没有任何与Android相关的依赖?
有没有办法可以测试我的应用程序中还有其他活动是否还活着?我希望在onDestroy方法中停止服务,但是如果我的应用程序中没有其他活动在堆栈上仍然存在,则只想这样做.
我有调用停止主活动的onDestroy()方法中的服务.除了如果用户启动我的应用程序,然后在我的应用程序中启动一些活动,然后点击主屏幕和RELAUNCHES我的应用程序,它们将颠覆我的订单,主要活动现在将高于我的应用程序的其他活动之外,这是完美的.从这种状态,如果他们点击后退按钮并"退出"我的主屏幕,他们将触发onDestroy()方法并终止服务,即使堆栈上还有其他活动打开.我想通过停止服务来避免这种情况,如果我确定我的其他活动没有在堆栈上打开.可能?
这在Android应用程序中是否可行?我想做到这一点,无论用户多少次开始活动A,当他们点击后退按钮时,他们将永远不会出现多次活动A.
我在当前代码中发现的是我只有两个选项:1.我可以在activityA中调用finish(),这将阻止它完全通过后退按钮访问,或2.我不调用finish(),然后,如果用户在使用期间开始活动A(n)次,则在按下后退按钮时将有(n)个实例.
同样,我希望通过按下后退按钮来访问activityA,但没有理由在堆栈上保留同一活动的多个实例.有没有办法将队列中活动的实例数限制为1?
我之前曾问过一个我仍然无法解决的问题:
http://stackoverflow.com/questions/3126347/android-relativelayout-how-to-alignparentbottom-when-wrapped-in-a-scrollview
Run Code Online (Sandbox Code Playgroud)
我想要做的是使用RelativeLayout或LinearLayout将视图对齐到屏幕底部,然后将该布局包装在滚动视图中以允许在必要时滚动(对于横向方向或小屏幕设备的更改).
到目前为止,我发现任何与父底部对齐的东西都可以很好地工作,只要底部是可见的......但如果底部位于滚动下方,则父母底部对齐的视图会跳到顶部.
对于出现在底部的广告来说,这似乎是一种非常常见的设计,所以我认为这是可能的.是吗?
使用SAX解析器时,如果节点内容中存在"解析",则解析失败.如何解决此问题?我是否需要转换所有字符?
换句话说,任何时候我在节点中都有引号:
<node>characters in node containing "quotes"</node>
Run Code Online (Sandbox Code Playgroud)
当Handler解析它时,该节点被屠宰成多个字符数组.这是正常的行为吗?引号为什么会引起这样的问题?
这是我正在使用的代码:
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
...
HttpGet httpget = new HttpGet(GATEWAY_URL + "/"+ question.getId());
httpget.setHeader("User-Agent", PayloadService.userAgent);
httpget.setHeader("Content-Type", "application/xml");
HttpResponse response = PayloadService.getHttpclient().execute(httpget);
HttpEntity entity = response.getEntity();
if(entity != null)
{
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
ConvoHandler convoHandler = new ConvoHandler();
xr.setContentHandler(convoHandler);
xr.parse(new InputSource(entity.getContent()));
entity.consumeContent();
messageList = convoHandler.getMessageList();
}
Run Code Online (Sandbox Code Playgroud) 在一个iPhone应用程序中,我创建了一个常量文件来保存我的全局变量:
MyConstants.h
extern NSMutableString * MY_GATEWAY;
MyConstants.m
NSMutableString * MY_GATEWAY;
Run Code Online (Sandbox Code Playgroud)
在我的app委托中,我导入了MyConstants.h,并且可以成功附加到MY_GATEWAY并使用以下URL来初始化我的全局变量:
MY_GATEWAY = [NSMutableString stringWithString:MY_PROTOCOL];
[MY_GATEWAY appendString:MY_HOST];
Run Code Online (Sandbox Code Playgroud)
从我的app delegate,在初始化MY_GATEWAY后,我启动了一个新线程.我的线程类也导入MyConstants.h,在该线程的主循环中我尝试读取MY_GATEWAY,但值为garbage:
2011-08-13 22:23:47.246 MyProject[930:5c03] da.lproj
Run Code Online (Sandbox Code Playgroud)
我是否应该能够从辅助线程中读取此变量?如果是这样,我做错了什么?