【问题标题】:How do i use the ProgressDialog from a Non-Activity Class on android我如何在 android 上使用非活动类中的 ProgressDialog
【发布时间】:2012-10-06 07:22:48
【问题描述】:

在我的应用程序中,我有一个活动(MainActivity.java)和一个类(非活动类 - SubClass.java)。子类有一个 ProgressDialog。我将从 MainActivity 调用子类。

我的问题是如何使用来自活动类(MainActivity.java)的非活动类(SubClass.java)的ProgressDialog

我在 setProgress() 和包声明时收到空指针异常错误。

我做了以下事情

1) 在 MainActivity 中,我使用构造函数为子类创建对象。

    SubClass pro = new SubClass(MainActivity.this);
    pro.call_fun();

2) 在子类中:整个编码;

package com.progresss;  // Line No : 1 ; Shows Null Pointer Exception
public class SubClass {
Context context = null;
public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private NotificationManager notificationManager;
private Notification notification;
private int progress_val = 0;
private String fileURL = "http://xxxxx.com/folder/sampleproject.apk";
private String destination = null;
private ProgressDialog downloadProgressDialog;

public SubClass(MainActivity progress_DialiogActivity) {
    this.context = progress_DialiogActivity;
}

public void call_fun(){
    new DownloadFileAsync().execute(fileURL);
}

    //  Updated APK File Download Task.
class DownloadFileAsync extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        ((Activity) context).showDialog(DIALOG_DOWNLOAD_PROGRESS);
    //          Notification Coding     
        ...........
        notification.contentIntent = contentIntent;
    //          -------------------            
        notificationManager =(NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
        notificationManager.notify(0, notification);
    }

    @Override
    protected String doInBackground(String... aurl) {
        try {
    //              .......         
        } catch (Exception e) {
            Log.e("Error Report Download Manager", e.getMessage());
          }
        return null;
    }

    protected void onProgressUpdate(String... progress) {
         progress_val = Integer.parseInt(progress[0]);
         .......
         downloadProgressDialog.setProgress(Integer.parseInt(progress[0]));   // Line No : 100 ; Shows Null Pointer Exception
    }

    @Override
    protected void onPostExecute(String unused) {
        notificationManager.cancel(0);
    //          ((Activity) context).dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
        ((Activity) context).removeDialog(DIALOG_DOWNLOAD_PROGRESS);
        Log.e("Download", "Stop");

    //          Notification Coding     
        notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
        .........
        notificationManager.notify(0, notification);

    //          Open The Install App Activity(Intent) Here.            
        ........
    }
} // Async Task Class End

    //our progress bar settings
protected Dialog onCreateDialog(int id) {
    switch (id) {
        case DIALOG_DOWNLOAD_PROGRESS: //we set this to 0
            downloadProgressDialog = new ProgressDialog(context);
            downloadProgressDialog.setMessage("Downloading file...");
            downloadProgressDialog.setMax(100);
            downloadProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            downloadProgressDialog.setCancelable(false);
            downloadProgressDialog.show();
            return downloadProgressDialog;
        default:
            return null;
    }
  }
}

这是 LogCat 错误消息:

    FATAL EXCEPTION: main
java.lang.NullPointerException
at com.progresss.SubClass$DownloadFileAsync.onProgressUpdate(SubClass.java:100)
at com.progresss.SubClass$DownloadFileAsync.onProgressUpdate(SubClass.java:1)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:432)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)

进度对话框代码在活动类中运行良好。我猜 ProgressDialog 可能没有正确初始化。请帮我。

【问题讨论】:

  • 你检查过onCreateDialog是否被调用了吗?
  • 没有 onCreateDialog 未被调用。我在 onCreateDialog 的开头添加了 Log.e()。它没有显示日志。
  • 哪里调用了onCreateDialog??甚至你的代码设计也很糟糕......
  • @ Mohit Sharma ,实际上我需要在非活动类中执行该过程。现在我重新排列了我的代码。

标签: android android-asynctask android-progressbar


【解决方案1】:

onCreateDialog 未执行。请将代码移至onPreExecute 方法。

onCreateDialog 是回调方法,它只会在活动中被调用,在你的子类中它只是一个方法。

【讨论】:

  • 你的意思是把onCreateDialog代码移到OnPreExecute方法中
  • 您应该将编写在 OnCreateDialog 中的代码移动到 OnPreExecute
【解决方案2】:

我遇到了同样的问题。在我将 onCreateDialog 移到 onPreExecute 后,它不起作用。

我把pro.call_fun()改成pro.call_fun(MainActivity.this)后解决了这个问题,然后 在pro.call_fun(MainActivity.this) 中创建downloadProgressDialog = new ProgressDialog(context)

它对我有用。

【讨论】:

    猜你喜欢
    • 2015-04-05
    • 2015-04-14
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2014-03-14
    相关资源
    最近更新 更多