快速摘要:我正在创建一个解析二进制文件,存储顶点及其属性的应用程序,并在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;
}
}
}
当我调用 dialog = new ProgressDialog(context); 它在空指针异常时出错,我假设是因为存在上下文问题...有没有人有任何想法?
答案 0 :(得分:3)
首先,您不应该自己创建OpenGLRenderer
,因为它是Activity
并且应该由系统管理。当您自己创建OpenGLRenderer
时,此活动的上下文未正确初始化。当您使用无效上下文创建ProgressDialog时,您会收到NullPointerException
。
但即使您正确启动OpenGlRenderer
,您的应用仍然会在以下行崩溃:
dialog.setProgress(percentParsed);
您应该使用publishProgress
并在AsyncTask的onProgressUpdate
函数中更新ProgressDialog。那是因为你无法从非ui线程更新UI。
答案 1 :(得分:2)
也许尝试在setLAS()方法中用“OpenGLRenderer.this”替换“this”。它似乎不是你发布的代码,但有时如果你从不同的对象类型进行调用,它会尝试传入一个OnClickListener(或你调用的任何对象)而不是一个活动,因此对象没有上下文。就像我说的那样似乎并非如此,但值得一试。
你在哪里调用setLAS()?或者也可以发布你的代码部分。
编辑:
尝试修改setLAS()方法以获取Context参数并将其从第一个活动传入,并将其从第二个活动传递到异步任务,而不是使用第二个活动的上下文。