Android ProgressDialog上下文问题
快速总结:我正在制作一个应用程序,它解析二进制文件,存储顶点及其属性,并在openGL中显示它们。我试图在解析过程中实现一个ProgressDialog,但遇到了相当大的麻烦。我在很多地方都尝试过实现这一点,但这是我当前的设置:Android ProgressDialog上下文问题,android,progressdialog,android-context,Android,Progressdialog,Android Context,快速总结:我正在制作一个应用程序,它解析二进制文件,存储顶点及其属性,并在openGL中显示它们。我试图在解析过程中实现一个ProgressDialog,但遇到了相当大的麻烦。我在很多地方都尝试过实现这一点,但这是我当前的设置: public class PointViewer extends Activity{ ... @Override public void onCreate(Bundle savedInstanceState) {
public class PointViewer extends Activity{
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
filePath = extras.getString("file_path");
mGLView = new GLSurfaceView(this);
theRenderer = new OpenGLRenderer();
mGLView.setRenderer(theRenderer);
//Parse the file and set the arrays
theRenderer.setLAS(filePath);
setContentView(mGLView);
}
...
}
渲染类
public class OpenGLRenderer extends Activity implements GLSurfaceView.Renderer {
...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void setLAS (String fileName){
new ProgressTask(this).execute();
}
...
/*
* The class for the progress dialog
*/
private class ProgressTask extends AsyncTask<String, Void, Boolean> {
private ProgressDialog dialog;
private Context context;
//private List<Message> messages;
public ProgressTask(Context ctx) {
context = ctx;
dialog = new ProgressDialog(context);
}
/** progress dialog to show user that the backup is processing. */
protected void onPreExecute() {
this.dialog.setMessage("Progress start");
this.dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
this.dialog.show();
}
@Override
protected void onPostExecute(final Boolean success) {
if (dialog.isShowing()) {
dialog.dismiss();
}
if (success) {
Toast.makeText(context, "OK", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "Error", Toast.LENGTH_LONG).show();
}
}
protected Boolean doInBackground(final String... args) {
try{
ptCloud = new PointCloud(args[0]);
...
dialog.setProgress(percentParsed);
return true;
} catch (Exception e){
Log.e("tag", "error", e);
return false;
}
}
}
public类OpenGLRenderer扩展活动实现GLSurfaceView.Renderer{
...
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
公共void setLAS(字符串文件名){
新建ProgressTask(this.execute();
}
...
/*
*进度对话框的类
*/
私有类ProgressTask扩展了AsyncTask{
私人对话;
私人语境;
//私人列表消息;
公共进程任务(上下文ctx){
上下文=ctx;
dialog=新建进度对话框(上下文);
}
/**“进度”对话框,向用户显示备份正在处理*/
受保护的void onPreExecute(){
this.dialog.setMessage(“进度开始”);
this.dialog.setProgressStyle(ProgressDialog.STYLE_水平);
this.dialog.show();
}
@凌驾
受保护的void onPostExecute(最终布尔值成功){
if(dialog.isShowing()){
dialog.dismise();
}
如果(成功){
Toast.makeText(上下文“OK”,Toast.LENGTH_LONG).show();
}否则{
Toast.makeText(上下文,“错误”,Toast.LENGTH_LONG).show();
}
}
受保护的布尔doInBackground(最终字符串…args){
试试{
ptCloud=新的点云(args[0]);
...
对话框.setProgress(百分比解析);
返回true;
}捕获(例外e){
Log.e(“标记”、“错误”,e);
返回false;
}
}
}
当我调用dialog=newprogressdialog(上下文)时它在空指针异常上出错,我假设是因为存在上下文问题……有人有什么想法吗?首先,你不应该自己创建
OpenGLRenderer
,因为这是一个活动,应该由系统管理。当你自己创建OpenGLRenderer
时,这个活动y的上下文初始化不正确。当您的“创建进程”对话框的上下文无效时,您将收到NullPointerException
但即使您正确启动了OpenGlRenderer
,您的应用程序仍会在第行崩溃:
dialog.setProgress(percentParsed);
您应该改为在AsyncTask的函数中使用并更新ProgressDialog。这是因为您无法从非UI线程更新UI。可以尝试在setLAS()中用“OpenGLRenderer.this”替换“this”方法。从您发布的代码来看,它似乎不是这样,但有时如果您是从不同的对象类型进行调用,它会尝试传入OnClickListener(或您从中调用的任何对象)而不是activity,因此该对象没有上下文。正如我所说,情况似乎不是这样,但值得一试
另外,您从哪里调用setLAS()呢?也许您也可以发布这段代码
编辑:
尝试修改setLAS()方法,使其具有上下文参数,并将其从第一个活动传入,然后将其从第二个活动传递到异步任务,而不是使用第二个活动的上下文。无法启动活动。…错误/AndroidRuntime(25782):位于…OpenGLRenderer$ProgressTask。(OpenGLRenderer.java:303),我在问题中标记的。是的,我也想到了,我刚刚尝试过,错误完全相同。在我发布的第一段代码中调用了setLAS(),然后才调用setContentView()-谢谢!这使所有功能都正常了,除了ProgressDialog不会随时间更新之外,我怀疑inazaruk知道为什么会这样。-非常棒的帮助,谢谢!我在写这篇文章时在线查看了onProgressUpdate函数,但它必须在某个地方手动调用吗?它什么时候得到处理。而且,在这一点上,这是真的吗更重要的是,因为我不能创建对话框?否则我将如何设置渲染器?我还应该说,在我完成对话框想法和AsyncTask功能之前,一切都很好。我已经更新了关于创建对话框时为什么会收到异常的答案。另外,关于onProgressUpdate
,此功能在UI上调用从doInBackground()
函数调用publishProgress
后执行线程。我不明白“自己创建OpenGLRenderer”是什么意思。几周前,当我回顾OpenGL时,每个人似乎都像我在这里做的一样(不包括活动扩展,我想让上下文通过它)。我想我只是对如何获取正确的上下文感到困惑,因为在对话框实现之前,它一直在工作。-感谢您的帮助,tooThen不会将活动
和路径上下文
值扩展为OpenGLRenderer
的构造函数的参数。例如,将上下文保存到mContext
字段,当您要创建ProgressDialog
时,您将使用newprogressdialog(mContext)
。