Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将长文本写入TextView而不阻塞UI线程_Java_Android - Fatal编程技术网

Java 将长文本写入TextView而不阻塞UI线程

Java 将长文本写入TextView而不阻塞UI线程,java,android,Java,Android,我还没有在网上找到任何解决方案,所以我在这里问了这个问题。我在Android中创建了一个简单的文本文件查看器。由于读取文件可能是一项非常耗时的任务,因此它会在不同的线程中读取文件,然后将内容写入UI线程上的TextView。这是我的密码: 导入android.Manifest; 导入android.app.Activity; 导入android.content.pm.PackageManager; 导入android.graphics.Color; 导入android.opengl.Visibi

我还没有在网上找到任何解决方案,所以我在这里问了这个问题。我在Android中创建了一个简单的文本文件查看器。由于读取文件可能是一项非常耗时的任务,因此它会在不同的线程中读取文件,然后将内容写入UI线程上的TextView。这是我的密码:

导入android.Manifest;
导入android.app.Activity;
导入android.content.pm.PackageManager;
导入android.graphics.Color;
导入android.opengl.Visibility;
导入android.os.Bundle;
导入android.text.method.ScrollingMovementMethod;
导入android.view.view;
导入android.widget.EditText;
导入android.widget.ProgressBar;
导入android.widget.TextView;
导入android.widget.Toast;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileReader;
导入java.io.IOException;
公共类MainActivity扩展了活动{
编辑文本路径;
文本视图内容;
字符串文件路径;
ProgressBar-pb;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
路径=findViewById(R.id.path);
contents=findviewbyd(R.id.contents);
pb=findViewById(R.id.progressBar);
setMovementMethod(新的ScrollingMovementMethod());
}
私有void checkPermission(){
if(this.checkSelfPermission(Manifest.permission.READ\u EXTERNAL\u STORAGE)!=PackageManager.permission\u provided){
this.requestPermissions(新字符串[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
}
}
@凌驾
public void onRequestPermissionsResult(int-requestCode、字符串[]权限、int[]grantResults){
super.onRequestPermissionsResult(请求代码、权限、授权结果);
if(requestCode==1){
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION\u已授予){
Toast.makeText(getApplicationContext(),“已授予权限”,Toast.LENGTH_SHORT.show();
}否则{
Toast.makeText(getApplicationContext(),“权限被拒绝\n应用程序无法工作\n请在设置中启用权限”,Toast.LENGTH\u SHORT).show();
}
}
}
公共空白显示(视图){
checkPermission();
file_path=path.getText().toString();
pb.setVisibility(View.VISIBLE);
contents.setText(“”);
contents.setTextColor(颜色为黑色);
线程t=新线程(新读卡器());
t、 start();
}
类读取器实现可运行{
公开募捐{
试一试{
文件f=新文件(文件路径);
BufferedReader br=新的BufferedReader(新文件读取器(f));
弦线;
最终StringBuilder sb=新StringBuilder();
而((line=br.readLine())!=null){
sb.append(行)。append(“\n”);
}
sb.deleteCharAt(sb.length()-1);//删除最后的换行符
contents.post(新的Runnable(){
@凌驾
公开募捐{
contents.setText(sb.toString());
}
});
}捕获(最终IOE例外){
contents.post(新的Runnable(){
@凌驾
公开募捐{
contents.setTextColor(Color.RED);
contents.setText(如getMessage());
}
});
}
pb.post(新的Runnable(){
@凌驾
公开募捐{
pb.setVisibility(View.GONE);
}
});
}
}
}
它可以很容易地显示小文件,但如果文件内容太大,UI会暂停一段时间,并显示ANR(应用程序无响应)消息。

这种情况不仅发生在文件中,而且在将很长的文章写入文本视图时也会发生。我能做些什么来避免这种情况?处理这种情况的最佳做法是什么?欢迎提供不涉及支持库的解决方案。请询问是否需要更多信息。

使用webview呈现其中的文本如何?这样做是否是一种好的做法?是的,如果它满足您的所有要求,如UI和UX,则是。是的,它可以工作,但它不是比TextView更重的选项吗?是的,它比TextView稍重。您可以尝试将文本拆分为多个文本视图。使用Web视图在其中呈现文本如何?这样做是否是一种好的做法?是的,如果它满足您的所有要求(如UI和UX)。是的,它可以工作,但它不是比文本视图更重的选项吗?是的,它比文本视图重一点。您可以尝试将文本拆分为多个文本视图。