Android 线程空指针异常中的进度对话框
嗨,我有一个片段,当我从MainActivity调用它时,我启动一个线程来显示BD的一些内容Android 线程空指针异常中的进度对话框,android,Android,嗨,我有一个片段,当我从MainActivity调用它时,我启动一个线程来显示BD的一些内容 private ProgressDialog progressDialog; @Override public void onStart() { super.onStart(); Bundle args = getArguments(); if ( args != ) { progressDi
private ProgressDialog progressDialog;
@Override
public void onStart()
{
super.onStart();
Bundle args = getArguments();
if ( args != )
{
progressDialog.show( getActivity(), "Query", "Please wait", true, false );
// Here i call my thread
mRutFechas( progressDialog );
}
}
我的线
private void mRutFechas( final ProgressDialog progressDialog )
{
Thread nt = new Thread()
{
@Override
public void run()
{
// Lot of BD Conecction work
// Display
getActivity().runOnUiThread( new Runnable()
{
@Override
public void run()
{
// Screen update
}
});
progressDialog.dismiss();
}
};
nt.start();
}
弹出窗口将正确显示,但关闭显示的时间已到
03-12 11:52:29.132 25504-25618/com.example.camilo.relojcontrol_navdraw E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-9962
java.lang.NullPointerException
at com.example.camilo.relojcontrol_navdraw.F_RelojMostrar$2.run(F_RelojMostrar.java:301)
编辑:当我在运行UI线程时,它给我这个错误
03-12 12:20:09.652 27235-27235/com.example.camilo.relojcontrol_navdraw E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at com.example.camilo.relojcontrol_navdraw.F_RelojMostrar$2$1.run(F_RelojMostrar.java:300)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4963)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
at dalvik.system.NativeStart.main(Native Method)
主线程也称为UI线程。这意味着除了主线程外,您不能更新任何其他线程中的任何UI。因此,您不能在后台线程中取消ProgressDialog。只要把它放在主线上,一切都会好起来的
getActivity().runOnUiThread(new Runnable() {
@Override
public void run()
{
progressDialog.dismiss();
}
});
您的
ProgressDialog代码>在mRutFechas()中为NULL
因为show()
方法将创建一个作为静态的进程对话框
试着改变它
private ProgressDialog progressDialog;
@Override
public void onStart()
{
super.onStart();
Bundle args = getArguments();
if ( args != )
{
progressDialog = new ProgressDialog(getActivity());
progressDialog.setTitle("Query");
progressDialog.setMessage("Please wait");
progressDialog.setCancelable(true);
progressDialog.show();
// Here i call my thread
mRutFechas(progressDialog);
尝试此操作并让我知道发生了什么。请初始化进度对话框:
private ProgressDialog progressDialog;
progressDialog = new ProgressDialog(Mainactivity.this);
您应该使用AsyncTaskputprogressDialog.Disclease()代码>在run()的runOnUiThread
方法的内部作为最后一行。发布完整的堆栈跟踪(错误日志)。编辑错误日志哪个是F_RelojMostrar.java
中的代码行300?在UI线程中运行给我03-12 12:20:09.652 27235-27235/com.example.camilo.relojcontrol\u navdraw E/androjruntime﹕ 致命异常:main java.lang.NullPointerException检查主帖子我编辑了错误logidk为什么我会出现nullpointer异常,也许如果我尝试异步任务?显然progressDialog变量为null。请尝试进行步骤调试,看看它是否真的为空以及原因。是的,我忘记了初始化,正如您所说的ProgressDialog ProgressDialog=newprogressdialog(yourActivity.this)代码>现在它不是空的,但是在线程内部我不能放置代码'progressDialog.Disclease();`因为编译器说错误:(299,25)错误:从内部类访问局部变量progressDialog;需要声明为final
因此,如果我将我的方法声明为静态变量private void mRutFechas(final ProgressDialog ProgressDialog)
弹出窗口会显示在屏幕上,但不会关闭并永远显示。-tyfeedback@Junshi-这是runOnUiThread()的run()
中的最后一行吗?它应该在那里。并声明ProgressDialog ProgressDialog
为代码上方的类级成员,仅供您理解。在onStart()
中,它看起来像progressDialog=newprogressdialog(getActivity())代码>。是的,这是最后一个UI运行线程,这是一个棘手的问题,我可以尝试异步任务吗?