我想让Dagger在我的项目上工作.
但是,在编译期间,我在其中一个类上遇到以下异常:
错误:Foo上没有可注射成员.你想添加一个注射构造函数吗?
但是,该类没有依赖关系,因此使用默认的no-arg构造函数:
public class Foo
{
...
}
Run Code Online (Sandbox Code Playgroud)
我是否真的需要添加一个像下面这样的可注射无参数构造函数?
public class Foo
{
@Inject
public Foo()
{
}
....
}
Run Code Online (Sandbox Code Playgroud) 我想在ActionBar中显示ProgressBar,而我的SyncAdapter正在主动与Web同步内容.
我已尝试将SyncStatusObserver与ContentProvider.addStatusChangeListener一起使用.但是,我无法检查SyncAdapter是否正在运行.我只能检查:
可以组合这些标志:!isSyncPending && isSyncActive这样就可以检查SyncAdapter是否正在正常工作,并且没有任何待处理的工作.但是,在某些情况下,SyncAdapter正在正常工作,并有第二个等待它的待处理请求.
看起来很简单,但我无法找到解决这个问题的方法.在SyncAdapter未运行时显示ProgressBar会让用户感觉同步非常慢.让它不显示ProgressBar会让用户认为没有任何事情发生.
代码中的上述解决方案如下所示.我们在activity.onResume中注册观察者:
int mask = ContentResolver.SYNC_OBSERVER_TYPE_PENDING | ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE;
syncHandle = ContentResolver.addStatusChangeListener(mask, syncObserver);
Run Code Online (Sandbox Code Playgroud)
syncObserver在这里定义为:
syncObserver = new SyncStatusObserver()
{
@Override
public void onStatusChanged(int which)
{
Account account = getSomeAccount();
boolean syncActive = ContentResolver.isSyncActive(account, CONTENT_AUTHORITY);
boolean syncPending = ContentResolver.isSyncPending(account, CONTENT_AUTHORITY);
boolean isSynchronizing = syncActive && !syncPending;
updateRefreshButtonState();
}
}
Run Code Online (Sandbox Code Playgroud) Model-View-Presenter(MVP)是一种众所周知的GUI应用程序设计模式.对于Android,在普通Java模块中实现业务逻辑有助于测试而无需Android模拟器.
但是,由于Android应用程序GUI的特殊要求,我在Android上实现模式时遇到了困难:
可以在任何时候销毁活动(来电,用户按下主页按钮,......),并且在重新创建时,它应该处于与其离开时完全相同的状态.这与大多数其他GUI应用程序不同.
活动可以经历许多生命周期状态.可能会暂停,在这种情况下,不应修改活动的UI.例如,如果某些数据在后台加载,则如果它处于暂停状态,则无法将其传递给MVP(Activity)的View部分.同样,这是一个不寻常的要求.
我已经阅读了MVP for Android的博客文章并查看了示例源代码.我试图通过使用MVP模式实现的最终目标是能够使用转换器j2objc将所有业务逻辑转换为Objective-C ,这样在iOS上实现相同的应用程序时可以重用业务逻辑.
有没有人成功实现了Android的MVP模式,在这种情况下,我错过了什么?
我正在尝试使用WebView开发Android浏览器应用程序,使用户能够从自定义协议访问内容.自定义协议可能是foobar://
我想拦截对此自定义协议的所有请求.这意味着:
我需要能够将这些操作的结果交还给WebView.
可以使用shouldInterceptRequest(可从API级别11获得)处理GET请求.
现在我的问题是:我如何能够接受和处理POST请求?
android url-interception protocol-handler android-webview webviewclient
我想创建一个通知,点击后,在Android市场上打开我的应用程序.
我尝试了几件事,如下所示:
NotificationCompat.Builder builder = new NotificationCompat.Builder(application);
builder.setAutoCancel(true);
// (set titles, icon, ...)
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=com.android.example"));
builder.setContentIntent(PendingIntent.getActivity(application, 0, intent, 0));
Notification notification = builder.build();
NotificationManager manager = (NotificationManager) application.getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(0, notification);
Run Code Online (Sandbox Code Playgroud)
但是,单击时,没有任何反应.谁知道如何让这个工作?
以下是我对单元测试的要求:
这似乎是合理的要求.但是,当我需要使用诸如assertEqualson对象之类的方法时,总会出现问题,因为这些equals方法需要覆盖该方法.该equals方法必须在生产类中实现,但实际上仅用于测试.如果良好的编码实践规定如果equals被覆盖,那么这将变得更加糟糕,然后hashCode也应该实施,从而导致更多未使用的生产代码使生产类混乱.
这是一个User模型的简单示例(IntelliJ自动实现equals和hashCode)
public class User
{
public long id;
public long companyId;
public String name;
public String email;
public long version;
@Override
public boolean equals(Object o)
{
if(this == o) return true;
if(o == null || getClass() != o.getClass()) return false;
User user = (User) o;
if(companyId != user.companyId) return false;
if(id != user.id) return false;
if(version != user.version) …Run Code Online (Sandbox Code Playgroud) 我正在使用stripos函数来检查字符串是否位于另一个字符串内,忽略任何情况.
这是问题所在:
stripos("ø", "Ø")
Run Code Online (Sandbox Code Playgroud)
返回false.而
stripos("Ø", "Ø")
Run Code Online (Sandbox Code Playgroud)
返回true.
正如您可能看到的,在这种情况下,函数似乎不会执行不区分大小写的搜索.
该功能与Ææ和åå等字符有同样的问题.这些是丹麦人物.
从API级11 setDividerDrawable()和setShowDividers()被引入上LinearLayout,使线性布局来显示子元素之间的分隔.我真的很想使用这个功能,但我也在Honeycomb之前定位设备(API级别<11).
解决此问题的一种方法是扩展LinearLayout并手动添加分隔符.这是一个原型:
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
public class DividerLinearLayout extends LinearLayout
{
public DividerLinearLayout(Context context)
{
super(context);
}
public DividerLinearLayout(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public DividerLinearLayout(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
@Override
public void addView(View child)
{
if(super.getChildCount() > 0)
{
super.addView(LayoutInflater.from(getContext()).inflate(R.layout.divider, null));
}
super.addView(child);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,使用这样的实现将改变迭代子进程的任何客户端的行为.一些视图将是客户自己插入的视图,一些视图将被插入DividerLinearLayout.如果用户在指定索引处插入视图,也会发生问题.可以实现索引的转换,但如果做错了,这可能会导致令人讨厌的错误.此外,我认为需要覆盖更多的方法.
有没有更好的方法来解决这个问题?有人已经开发出可自由使用的DividerLinearLayout等效物吗?它似乎不存在于Android的兼容性库中.
android android-layout android-linearlayout android-compatibility android-support-library
我有一些客户端代码使用我想测试的流与服务器通信.我想测试客户端将正确的命令发送到服务器.
为此,我创建了一个Connect方法,它接受两个流:一个是客户端读取的,另一个是客户端写入的.然后,我可以向两者提供MemoryStream,并读取客户端写入的MemoryStream发出的命令.
我的问题是我需要编写一个需要这两个流相同的方法.我也注意到,我唯一需要使用两个不同的流,就是当我想测试客户端时.因此,我想重构Connect方法只接受一个流,它将被写入和读取.
我无法将MemoryStream传递给此方法,因为write方法会写入一些内部字节数组,read方法也会从中读取.如果我将它提供给客户端,它将能够读取它刚刚发送的命令!
因此我会问什么流设置可以做到这一点?我只想要一个从一个源读取的流,但写入另一个源.我需要访问这两个源,以便"我的测试"服务器可以发送正确的命令响应,并读取客户端发送的命令.
本质上我需要两个流:S1和S2.一个流被提供给客户端,另一个流被提供给服务器.
S1的读取方法与S2的写入方法"连接"=> S1读取S2写入的内容.
S1的写入方法与S2的读取方法"连接"=> S2读取S1写入的内容.
这是客户端与服务器通信时的正常情况.在这里,我只想在记忆中做到这一点.我该如何编码呢?
假设我有一个这样的 Java 类:
public class Test
{
static { System.loadLibrary("test"); }
public native int foo();
}
Run Code Online (Sandbox Code Playgroud)
假设 foo() 方法正在执行一些 JNI 调用,并且其中一个调用失败(IE,抛出异常)。然后我想从 JNI 代码返回并在 Java 中抛出异常。例如:
jint Java_Test_foo(JNIEnv* env, jobject thiz)
{
jstring foobar = (*env)->NewStringUTF(env, "Hello from JNI !");
if(foobar == NULL) // Not enough memory. OutOfMemoryError is thrown
return NULL; // Return immediately to get exception thrown in Java
// Do other stuff
...
return some_computed_jint;
}
Run Code Online (Sandbox Code Playgroud)
问题是这return NULL不是一个吉特。例如,在 Android 中,我在编译时会收到此警告:
warning: return Makes Integer from Pointer …