我有一个使用自定义例外的应用,例如:
public class SomeException extends Exception{
private int iCode;
private String iMessage;
public SomeException(){
iCode = 201;
iMessage = **//Get the localized string R.string.error_201??**
}
@Override
public String getMessage() {
return iMessage;
}
@Override
public int getCode() {
return iCode;
}
}
Run Code Online (Sandbox Code Playgroud)
显然,我想要本地化错误消息.我有可能的解决方案,但他们不满足我.
1)将"Context"传递给构造函数,并执行ctx.getString(R.string.error_201) - > Fail,因为有时会从MODEL类抛出此异常,因此它们没有Context
2)在getMessage()函数中检索消息时传递"Context", - > Fail,必须覆盖super方法,以便像所有其他异常一样工作.
解决方案我现在有:我的应用程序中的所有活动都有onCreate:
public void onCreate(...){
Utils.RESOURCES = getResources();
...
}
Run Code Online (Sandbox Code Playgroud)
很脏的代码......我不喜欢这个解决方案.那么我的问题是:有没有一种方法可以在没有Context的情况下访问资源?最重要的是,像我这样的应用程序如何解决这个问题呢?
我在 kotlin 中的这段代码非常简单,如果满足某个条件,则返回一个值,或者为 null
val speed = location.speed.takeIf { it>=0 }
Run Code Online (Sandbox Code Playgroud)
我试图在 swift 中做同样的事情,但我发现的唯一方法是:
let speed:Double?
if (location.speed>=0){
speed = location.speed
}else{
speed = nil
}
Run Code Online (Sandbox Code Playgroud)
有没有更优雅的方法?
目前,我创建了一个这样的抽象类:
public abstract class MyClass {
public final static String TAG;
...
}
Run Code Online (Sandbox Code Playgroud)
但它给我一个错误,即不初始化最终变量.然后我尝试从构造函数初始化它,但它也没有工作(给出相同的错误加上另一个尝试将值设置为最终变量),尽管许多stackoverflow帖子说真的有用......
public abstract class MyClass {
public final static String TAG;
public MyClass(String u){
this.TAG = u;
}
}
Run Code Online (Sandbox Code Playgroud)
似乎只有在声明变量时才必须分配最终变量.它是否正确?我怎样才能做到这一点?
我简化了错误,我只有这个类:
class TestClass{
private var string = "Hello"
fun testError() {
string= "It Works"
GlobalScope.launch(Dispatchers.Default) {
string = "Doesn't work"
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在主线程(在 IOS 上)上启动 TestClass().testError(),它会抛出一个 InvalidMutabilityException(在 line --> string = "Doesn't work")。所以我认为在创建变量的线程之外的线程上更改变量可能不是一个好主意。所以我改成这样:
class TestClass{
private var string = "Hello"
fun testError() {
string= "It Works"
GlobalScope.launch(Dispatchers.Default) {
withContext(Dispatchers.Main) { string = "Doesn't work" }
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它仍然抛出一个错误:
kotlin.native.concurrent.InvalidMutabilityException:冻结 com.example.project.TestClass@fe10a8 的突变尝试
顺便一提。上面的两个代码都适用于 Android 端
这是我的自定义视图:
public class FilterView extends RelativeLayout{
public FilterView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public void init(){
//To test, I add just a test button that will change the color of the view
Button b = new Button(getContext());
b.setOnClickListener(new OnClickListener() {
public void onClick(View v) { setBackgroundColor(Color.GREEN); }
});
b.setText("TEST");
RelativeLayout.LayoutParams lay = new RelativeLayout.LayoutParams(100, 100);
addView(b, lay);
//Also have tried without settings the layoutparams...
setBackgroundColor(Color.BLUE);
}
}
Run Code Online (Sandbox Code Playgroud)
我在这样的活动中添加了这个自定义视图(红色背景):
<com.example.android.FilterView android:id="@+id/filter"
android:layout_width="100dip"
android:background="#FF0000"
android:layout_height="100dip"/>
Run Code Online (Sandbox Code Playgroud)
结果是一个颜色的视图...... BLUE,在init()中设置的那个,所以init中的代码被很好地调用.但是,视图内部没有任何内容,它只是蓝色,没有名为"TEST"的按钮,并且没有区域可点击,因为无论我点击何处视图都不会变为绿色