我想显示一个保存在应用程序数据目录中的日志文件(“/data/data/mypackage/files/log.txt”)。
我需要它在没有 eclipse的情况下调试我的应用程序。
目前,我在 textview 中显示内容文件,当我想刷新视图时,我单击一个重新加载我的 textview 的按钮。它很丑,但它有效。
我想要的是当我的日志文件被修改为 eclipse logcat 时自动刷新我的文本视图。
那么我该怎么做呢?
这是我所做的:
我的活动:
public class LogActivity extends Activity {
private TextView textView;
private String fileName = "/data/data/my.package.app/files/log.txt";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.log);
Typeface tf = Typeface.createFromAsset(getAssets(), "CONSOLA.TTF");
textView = (TextView) findViewById(R.id.textView1);
textView.setTypeface(tf);
setTextView();
new FileObserver(fileName) {
@Override
public void onEvent(int event, String path) {
Log.e("File", "EVENT");
if (event == FileObserver.MODIFY) {
Log.e("File", "MODIFY");
setTextView();
}
}
}.startWatching();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.log_activity, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_reload:
setTextView();
break;
case R.id.menu_empty:
File file = new File(fileName);
file.delete();
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
setTextView();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
private void setTextView() {
try {
FileReader fileReader = new FileReader(new File(fileName));
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line = "";
StringBuilder builder = new StringBuilder("");
while ((line = bufferedReader.readLine()) != null) {
builder.insert(0, line + "\n");
}
textView.setText(builder.toString());
bufferedReader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ScrollView
android:id="@+id/SCROLLER_ID"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:fillViewport="true">
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</ScrollView>
</LinearLayout>
我的菜单:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_reload"
android:title="Recharger"
android:orderInCategory="100"
android:showAsAction="always" />
<item android:id="@+id/menu_empty"
android:title="Vider"
android:orderInCategory="100"
android:showAsAction="always" />
</menu>
当我修改我的日志文件(通过 Android 服务)时,我有时会遇到文件已被修改但不是每次都被修改的事件。为什么 ?(如果我通过菜单手动重新加载视图,那么我会看到日志文件已更新)。
FileObserver 中对 setTextView() 的调用永远不会被调用?