Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.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
Android ProgressDialog上下文问题_Android_Progressdialog_Android Context - Fatal编程技术网

Android ProgressDialog上下文问题

Android ProgressDialog上下文问题,android,progressdialog,android-context,Android,Progressdialog,Android Context,快速总结:我正在制作一个应用程序,它解析二进制文件,存储顶点及其属性,并在openGL中显示它们。我试图在解析过程中实现一个ProgressDialog,但遇到了相当大的麻烦。我在很多地方都尝试过实现这一点,但这是我当前的设置: public class PointViewer extends Activity{ ... @Override public void onCreate(Bundle savedInstanceState) {

快速总结:我正在制作一个应用程序,它解析二进制文件,存储顶点及其属性,并在openGL中显示它们。我试图在解析过程中实现一个ProgressDialog,但遇到了相当大的麻烦。我在很多地方都尝试过实现这一点,但这是我当前的设置:

    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)