【发布时间】:2017-07-09 01:52:25
【问题描述】:
我有两个班级,A1 和 A2。两者都继承自BaseActivity,后者又继承自AppCompatActivity。
BaseActivity 有大量的日志记录语句来跟踪,例如,活动生命周期方法。像这样:Log.d(tag, "in onCreate");
正如预期的那样,这些消息是从A1 记录的,但不是来自A2!我尝试从 AS 和命令行监视 logcat。我可以在几个 Android 模拟器和几个开发环境中重复这个问题。
如果我简单地将Log.d(tag, "in onCreate") 替换为System.out.println(tag + ": in onCreate"),则会出现所有预期的消息。
在这一点上完全被迷惑了。有人对我的日志消息的去向有任何建议吗?
编辑添加:
我已将所有对 Log.d 的调用替换为对以下方法的调用:
private void log(String message) {
Log.d("LOGGER", tag);
Log.d(tag, message);
System.out.println(tag + ": " + message);
}
这是两个子类的示例输出:
07-09 10:26:42.036 9657-9657/net.callmeike.android.latest D/LOGGER: A1
07-09 10:26:42.036 9657-9657/net.callmeike.android.latest D/A1: in onCreate
07-09 10:26:42.036 9657-9657/net.callmeike.android.latest I/System.out: A1: in onCreate
07-09 10:27:10.837 9657-9657/net.callmeike.android.latest D/LOGGER: A2
07-09 10:27:10.837 9657-9657/net.callmeike.android.latest I/System.out: A2: in onCreate
看来变量tag 实际上是导致问题的原因。有人知道为什么吗?
FWIW:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="false"
android:theme="@style/AppTheme"
>
<activity
android:name=".A1"
android:label="@string/a1_name"
android:theme="@style/AppTheme.NoActionBar"
>
</activity>
<activity
android:name=".A2"
android:label="@string/a2_name"
android:theme="@style/AppTheme.NoActionBar"
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
编辑添加:三个 Activity 相关类的来源:
public abstract class BaseActivity extends AppCompatActivity {
private final String tag;
private final int layout;
public BaseActivity(String tag, int layout) {
this.tag = tag;
this.layout = layout;
}
protected abstract void test();
@Override
protected final void onCreate(Bundle savedInstanceState) {
Log.d(tag, "in onCreate");
super.onCreate(savedInstanceState);
setContentView(layout);
setSupportActionBar(findViewById(R.id.toolbar));
findViewById(R.id.fab).setOnClickListener(this::makeSnackbar);
}
final void makeSnackbar(View v) {
Snackbar.make(v, R.string.action_test, Snackbar.LENGTH_LONG)
.setAction(R.string.action_test, v1 -> test())
.show();
}
// blah blah blah
}
// BaseActivity logs show up in logcat
public class A1 extends BaseActivity {
private static final String TAG = "A1";
public A1() {
super(TAG, R.layout.activity_a1);
}
@Override
protected void test() {
// blah blah blah
}
}
// BaseActivity logs do not show up in logcat
public class A2 extends BaseActivity {
private static final String TAG = "A2";
public A2() {
super(TAG, R.layout.activity_a2);
}
@Override
protected void test() {
// blah blah blah
}
}
【问题讨论】:
-
您能否发布您的 java src 以显示您如何定义
A1和A2类? -
当然!我完全希望它有所帮助!
-
你不应该在你的活动中实现构造函数...
-
这是一个有根据的猜测,您的子类的标签没有被使用,因此您只能看到“一种”类型的日志记录
-
@G.BlakeMeike 感谢您的更正,我的意思是默认构造函数。