在网上搜索,目前尚不清楚Java 8是否支持Android开发.
在我下载/设置Java 8之前,有人可以在任何"官方"文档中指出我说Java 8是否支持Android开发.
我试图在Android Studio中试用Kotlin和Kotlin Android扩展程序.我已经在Ubuntu 14.04上的Android Studio v 1.5.1和OS X El Capitan上的Android Studio v 1.5.1中尝试了这一点,结果相同.
这是我在做的事情:
然后我进入生成的content_main.xml文件并为"Hello World!"添加一个id(hello).TextView中.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.gmail.npnster.mykotlinfirstproject.MainActivity"
tools:showIn="@layout/activity_main">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/hello"
/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
然后在转换后的MainActivity中添加一行来设置TextView.(如下所示).Android Studio然后提示我(通过alt-enter)插入此行(也显示如下)
import kotlinx.android.synthetic.main.content_main.*
Run Code Online (Sandbox Code Playgroud)
所以在这一点一切似乎罚款
但是当我尝试编译这个时,我得到了
Unresolved reference: kotlinx
Unresolved reference: kotlinx
Unresolved reference: hello
Run Code Online (Sandbox Code Playgroud)
注意,我并没有安装科特林的Android扩展插件.截至几天前,现在应该将其包含在主插件中并标记为已过时.(事实上,如果您在使用最新插件时尝试安装它,则不会安装任何新内容)
有谁看到我做错了什么?
主要活动
import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.support.design.widget.Snackbar
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import android.view.View
import …Run Code Online (Sandbox Code Playgroud) docker-compose文件https://docs.docker.com/compose/compose-file/#/volumes-volume-driver显示了相对于撰写文件安装主机子目录的各种方法.
例如:
卷:#只需指定一个路径,让Engine创建一个卷 - /var/lib/mysql
#指定绝对路径映射 - /opt/data:/ var/lib/mysql
#主机上的路径,相对于Compose文件 - ./cache:/tmp/cache
#用户相对路径 - 〜/ configs:/ etc/configs /:ro
#Named volume - datavolume:/ var/lib/mysql
是否可以在特定位置安装命名卷的子目录?例如下面的东西,我试过,但似乎不起作用.
# Named volume
- datavolume/sql_data:/var/lib/mysql
Run Code Online (Sandbox Code Playgroud)
我假设我可以通过将数据卷安装到类似位置/data然后在每个容器的Dockerfiles中来管理这个,创建从子目录到位置的符号链接.
例如,在docker-compose.yml文件中
volumes:
- datavolume:/data
Run Code Online (Sandbox Code Playgroud)
然后在容器Dockerfile中
RUN ln -s /data/sql_data /var/lib/mysql
Run Code Online (Sandbox Code Playgroud)
我开始沿着这条路走下去,但它变得凌乱而且无法正常工作.在我放弃这种方法或投入时间调试它之前,我想确保没有办法只指定命名vollume的子目录.
在异步模式下改装调用
public void success(T t, Response rawResponse)
Run Code Online (Sandbox Code Playgroud)
t是转换后的响应,rawResponse是原始响应.这使您可以访问原始响应和转换后的响应.
在同步模式下,您可以获得转换后的响应或原始响应
转换后的反应
@GET("/users/list")
List<User> userList();
Run Code Online (Sandbox Code Playgroud)
原始反应
@GET("/users/list")
Response userList();
Run Code Online (Sandbox Code Playgroud)
Response对象确实有一个获取正文的方法
TypedInput getBody()
Run Code Online (Sandbox Code Playgroud)
而改装api确实有一个转换器类,可以将其转换为java对象
Object fromBody(TypedInput body,Type type)
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何获取Converter对象的实例
我或许可以创建一个Converter类的实例,但这需要知道用于创建RestAdapter的Gson对象,我可能无法访问它.理想情况下,我想直接获取RestAdpater对转换器对象的引用.
public GsonConverter(Gson gson)和公共GsonConverter(Gson gson,String charset)我正在尝试遵循Angular 2快速入门,其中一个第一步是设置环境.我对npm并不是全新的 - 我设法安装并试用了Ember,但这就是它.
下面是我创建的package.json文件(从上面的链接复制).当我在npm install这里跑步是我得到的.
快速启动说我应该不会看到任何NPM ERR!线.
npm WARN optional Skipping failed optional dependency /chokidar/fsevents:
npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.0.12
npm WARN angular2-quickstart@1.0.0 No description
npm WARN angular2-quickstart@1.0.0 No repository field.
npm ERR! Linux 3.13.0-85-generic
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install"
npm ERR! node v5.10.1
npm ERR! npm v3.8.3
npm ERR! Invalid name: "@angular/core"
npm ERR!
npm ERR! If you need help, you may report this …Run Code Online (Sandbox Code Playgroud) 我试图测试从工厂生成的两个对象是否相同,但编译器似乎不允许对仅符合相同协议的对象进行身份检查.然而,将这两个对象转换为AnyObject似乎很好.反正有没有避免看似不必要的铸造?
这是一个简单的例子,演示了我所看到的内容(在swift 1.2中)
protocol FooBar {
}
class Foo: FooBar {
}
class Bar {
let foo1: FooBar?
let foo2: FooBar?
init() {
foo1 = Foo()
foo2 = Foo()
if foo1! as? AnyObject === foo2! as? AnyObject { // this is fine
}
if foo1! === foo2! { // Birnary operator '===' cannot be applied to two FooBar operands
}
}
}
Run Code Online (Sandbox Code Playgroud) 我的c ++非常生疏,仿制药总是让我很困惑,所以这种组合对我的大脑来说并不好,所以这就是我的问题.
我有一组类看起来像这样:
class MyEvent2 : public Event
{
public:
static constexpr char* CLASS_NAME = "MyEvent2";
MyEvent2(Object& sender) : Event(sender)
{
}
virtual ~MyEvent2() {}
static const char* EventId() {
return MyEvent2::CLASS_NAME;
}
const char* eventId() override {
return MyEvent2::CLASS_NAME;
}
};
Run Code Online (Sandbox Code Playgroud)
这些类将用于在事件总线上注册事件处理程序,因此我添加了这样的处理程序.
EventBus::AddHandler<MyEvent>(*this);
EventBus::AddHandler<MyEvent2>(*this);
Run Code Online (Sandbox Code Playgroud)
然后我创建事件的事件并像这样解雇它们:
MyEvent e1(*this);
MyEvent2 e2(*this);
EventBus::FireEvent(e1);
EventBus::FireEvent(e2);
Run Code Online (Sandbox Code Playgroud)
我的问题是如何使这个通用?我希望能够创建一些派生的"事件"类,我只需要包含真正需要唯一的一行
static constexpr char* CLASS_NAME = "TheClassName";
Run Code Online (Sandbox Code Playgroud)
顺便说一句:我知道可以使用typeid来获得这样的东西,但我不能在Arduino设备上使用它.
然后添加唯一的"事件"特定字段和成员.
这是我到目前为止所做的:
我创建了一个模板类(或者它应该被称为类模板?):
template<class T>
class ArduinoEvent : public Event
{
public:
T(Object& sender) : Event(sender)
{
}
virtual ~T() …Run Code Online (Sandbox Code Playgroud) 我正在尝试解决gcm超时问题,关于这个主题有很多线程,这里有一个供参考.
建议的解决方法是以比tcp超时短的间隔广播一对意图.
我的实现是创建一个扩展CountDownTimer类的类,并在现有服务中保存该类的实例.这个派生类在完成后重新启动并且服务被标记为STICKY_START,所以一旦启动,我认为它应该每4分钟继续广播意图,但由于某种原因存在间隙,当计数器没有广播时意图和我仍然与GCM服务器失去联系.
两个相关的课程如下.任何人都可以解释并提供一个解决方案,为什么这个策略不起作用?
我创建了一个扩展CounDownTimer的类,它应该每4分钟广播一次意图.
public class GcmKeepAlive extends CountDownTimer {
protected CountDownTimer timer;
protected Context mContext;
protected Intent gTalkHeartBeatIntent;
protected Intent mcsHeartBeatIntent;
public GcmKeepAlive(Context context) {
super(4*60* 1000,4*60*1000);
mContext = context;
gTalkHeartBeatIntent = new Intent("com.google.android.intent.action.GTALK_HEARTBEAT");
mcsHeartBeatIntent = new Intent("com.google.android.intent.action.MCS_HEARTBEAT");
System.out.println("stariing heartbeat countdown timer");
this.start();
}
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
System.out.println("sending heart beat to keep gcm alive");
mContext.sendBroadcast(gTalkHeartBeatIntent);
mContext.sendBroadcast(mcsHeartBeatIntent);
this.start();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的应用程序中的服务,它包含GcmKeepAlive类的实例
import android.app.Service; import android.content.Intent; import android.os.IBinder;
public …Run Code Online (Sandbox Code Playgroud) 更新:通过解决方案接受解释(错误)的答案点,但也可以看到我的基于Kotlin的解决方案作为下面的答案.
这段代码在Kotlin中,但我认为它是一个基本的android片段生命周期问题.
我有一个片段,其中包含对其他"subfragment"的引用
这基本上就是我在做什么:
retainInstance设置为true 的主片段onCreateView,我检查subfragment字段是否为null,如果是,我创建subFragment的实例并将其分配给字段当设备旋转时,我确实观察了被调用的子片段onPaused()和onDestroyView()方法,但是我没有看到在将子片段的保留引用添加到子片段的过程中在子片段上调用任何生命周期方法,当主片段添加到child_container时片段视图被重新创建.
净影响是我没有在主片段中看到子片段视图.如果我注释掉if(subfragment == null)并且每次只创建一个新的子片段,我确实在视图中看到了子片段.
下面的答案确实指出了一个错误,其中childFragmentManager在配置更改时不会保留.这最终将破坏我的预期用途,即在旋转后保留背板,但我认为我看到的是不同的东西.
我在活动onWindowFocusChanged方法中添加了代码,在首次启动应用程序时,我看到类似的内容:
activity is in view
fm = FragmentManager{b13b9b18 in Tab1Fragment{b13b2b98}}
tab 1 fragments = [DefaultSubfragment{b13bb610 #0 id=0x7f0c0078}]
Run Code Online (Sandbox Code Playgroud)
然后轮换后:
activity is in view
fm = FragmentManager{b13f9c30 in Tab1Fragment{b13b2b98}}
tab 1 fragments = null
Run Code Online (Sandbox Code Playgroud)
这里的fm是childFragmentManager,正如你所看到的,我们仍然有相同的Tab1Fragment实例,但它有一个新的childFragmentManager,我认为这是不需要的,并且由于下面的答案中报告了错误.问题是我确实将子碎片添加到这个新的 childFragmentManger中.所以看起来事务永远不会执行对保留的片段的引用,但是如果我创建一个全新的片段就完成了.(我确实试过调用executePendingTransactions新的childFragmentManager)
class Tab1Fragment: Fragment() {
var subfragment: DefaultSubfragment? = null
override fun onCreateView(inflater: …Run Code Online (Sandbox Code Playgroud) 我一直用我认为的Passive MVP来实现我的Android应用程序.
因此,例如在我的视图类中,我有一个ListView.
ListView userListView;
Run Code Online (Sandbox Code Playgroud)
当单击一个项目时,我会简单地在演示者上调用一个方法
userListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mPresenter.onUserSelected(position);
}
});
Run Code Online (Sandbox Code Playgroud)
我感到困惑的部分是ListView需要一个适配器.
所以目前在我的主持人中我有这个:
private ArrayList<User> mUserList = new ArrayList<User>();
Run Code Online (Sandbox Code Playgroud)
...
adapter = new UserListAdapter(getContext(), mUserList);
mView.setUserListAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
当我想改变一些东西时,我这样做:
mUserList.add(user);
adapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
这是适配器的正确位置吗?我问的原因是因为我最近想要使用swing进行一些工作,并且出现了类似的问题,JLists需要一个看似非常相似的ListModel.那么对于swing,ListModel应该驻留在哪里?