作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要从设备获取 logcat -v 时间并将其保存到 SD 卡中的文本文件中。问题是,当我按下按钮时,我的应用程序卡住了。
我知道这可能会发生,因为 logcat -v time 不断获取设备所有操作的日志,不间断。我需要所有这些信息。但我不知道如何正确编码。请问有人可以帮助我吗?
提前致谢!
这是我的代码:
btn_comeca.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Process process = Runtime.getRuntime().exec("logcat -v");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder log=new StringBuilder();
String line = "";
while ((line = bufferedReader.readLine()) != null) {
log.append(line);
}
try {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {
//Verifica permissão de gravar/ler
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MODE_ENABLE_WRITE_AHEAD_LOGGING);
}
}
File caminho_arquivo = new File("/sdcard/ARQUIVOFINAL.txt");
caminho_arquivo.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(caminho_arquivo);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
TextView tv = (TextView)findViewById(R.id.texttext);
String texto = "";
//tv.setText(log.toString());
texto = log.toString();
//outputStreamWriter.append(tv.getText());
outputStreamWriter.append(texto);
outputStreamWriter.close();
fileOutputStream.close();
Toast.makeText(getBaseContext(), "Text File Saved!", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
catch (IOException e) {}
}
最佳答案
问题可能是:您的逻辑同步工作。您永远不应该在主线程中执行类似的工作,因为它可能会导致 ANR(Android 无响应)。
不过,有很多方法可以解决这个问题。由于您没有使用多线程框架(例如 RxJava,如果您感兴趣,可以阅读它),因此可以使用 AsyncTask。您可以将其放置在监听器中。
编辑:不过,稍后再看看 MVVM 或 MVP 模式和多线程框架。这些东西广泛用于生产中执行不同类型的异步任务。
new AsyncTask<Void, Void, Void>(){
@Override
protected Void doInBackground(Void... params) {
// Place your logic here
return;
}
}.execute();
关于java - 如何在 Android 应用程序中获取 logcat -v 时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59266475/
我是一名优秀的程序员,十分优秀!