Java 通知中的ProgressBar[ANDROID]

Java 通知中的ProgressBar[ANDROID],java,android,multithreading,notifications,Java,Android,Multithreading,Notifications,我知道有很多关于它的话题。我知道有android开发者网站,即使我使用这个网站的代码,我也会有一个错误 我只想在通知中添加一个进度条。 所以我称之为我从Android开发者网站上获取的方法: public static void generateNotification(Context context){ final NotificationManager mNotifyManager =(NotificationManager) context.getSystemService

我知道有很多关于它的话题。我知道有android开发者网站,即使我使用这个网站的代码,我也会有一个错误

我只想在通知中添加一个进度条。 所以我称之为我从Android开发者网站上获取的方法:

public static void generateNotification(Context context){   

    final NotificationManager mNotifyManager =(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    final Notification.Builder mBuilder = new Notification.Builder(context);
    mBuilder.setContentTitle("Picture Download")
            .setContentText("Download in progress");
    // Start a lengthy operation in a background thread
    new Thread(
        new Runnable() {
            @Override
            public void run() {
                int incr;

                for (incr = 0; incr <= 100; incr+=5) {

                        mBuilder.setProgress(100, incr, false);                        
                        mNotifyManager.notify(0, mBuilder.build());

                            try {

                                Thread.sleep(5*1000);
                            } catch (InterruptedException e) {
                                Log.d("Generate Notif", "sleep failure");
                            }
                }
                // When the loop is finished, updates the notification
                mBuilder.setContentText("Download complete")
                .setProgress(0,0,false);
                mNotifyManager.notify(100, mBuilder.build());
            }
        }
    // Starts the thread by calling the run() method in its Runnable
    ).start();
}
这是:

E/WindowManager(9840): Activity com.main.LoginConnection has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@410c2238 that was originally added here
E/WindowManager(9840): android.view.WindowLeaked: Activity com.main.LoginConnection has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@410c2238 that was originally added here
E/WindowManager(9840):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:344)
E/WindowManager(9840):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
E/WindowManager(9840):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
E/WindowManager(9840):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
E/WindowManager(9840):  at android.view.Window$LocalWindowManager.addView(Window.java:537)
E/WindowManager(9840):  at android.app.Dialog.show(Dialog.java:278)
E/WindowManager(9840):  at com.main.LoginConnection.getRegisterId(LoginConnection.java:281)
E/WindowManager(9840):  at com.main.LoginConnection.onCreate(LoginConnection.java:101)
E/WindowManager(9840):  at android.app.Activity.performCreate(Activity.java:4465)
E/WindowManager(9840):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
E/WindowManager(9840):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
E/WindowManager(9840):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
E/WindowManager(9840):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
E/WindowManager(9840):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
E/WindowManager(9840):  at android.os.Handler.dispatchMessage(Handler.java:99)
E/WindowManager(9840):  at android.os.Looper.loop(Looper.java:137)
E/WindowManager(9840):  at android.app.ActivityThread.main(ActivityThread.java:4424)
E/WindowManager(9840):  at java.lang.reflect.Method.invokeNative(Native Method)
E/WindowManager(9840):  at java.lang.reflect.Method.invoke(Method.java:511)
E/WindowManager(9840):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/WindowManager(9840):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/WindowManager(9840):  at dalvik.system.NativeStart.main(Native Method)
E/WindowManager(9840): Activity com.main.LoginConnection has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41162188 that was originally added here
E/WindowManager(9840): android.view.WindowLeaked: Activity com.main.LoginConnection has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41162188 that was originally added here
E/WindowManager(9840):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:344)
E/WindowManager(9840):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
E/WindowManager(9840):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
E/WindowManager(9840):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
E/WindowManager(9840):  at android.view.Window$LocalWindowManager.addView(Window.java:537)
E/WindowManager(9840):  at android.app.Dialog.show(Dialog.java:278)
E/WindowManager(9840):  at com.Tools.UtilClass.openSettingApp(UtilClass.java:557)
E/WindowManager(9840):  at com.Tools.UtilClass$4.onClick(UtilClass.java:383)
E/WindowManager(9840):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
E/WindowManager(9840):  at android.os.Handler.dispatchMessage(Handler.java:99)
E/WindowManager(9840):  at android.os.Looper.loop(Looper.java:137)
E/WindowManager(9840):  at android.app.ActivityThread.main(ActivityThread.java:4424)
E/WindowManager(9840):  at java.lang.reflect.Method.invokeNative(Native Method)
E/WindowManager(9840):  at java.lang.reflect.Method.invoke(Method.java:511)
E/WindowManager(9840):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/WindowManager(9840):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/WindowManager(9840):  at dalvik.system.NativeStart.main(Native Method)
E/WindowManager(9840):活动com.main.LoginConnection已泄漏window com.android.internal.policy.impl.PhoneWindow$DecorView@410c2238原来是加在这里的
E/WindowManager(9840):android.view.WindowLeaked:Activity com.main.LoginConnection已泄漏window com.android.internal.policy.impl.PhoneWindow$DecorView@410c2238原来是加在这里的
E/WindowManager(9840):位于android.view.ViewRootImpl(ViewRootImpl.java:344)
E/WindowManager(9840):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
E/WindowManager(9840):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
E/WindowManager(9840):位于android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
E/WindowManager(9840):位于android.view.Window$LocalWindowManager.addView(Window.java:537)
E/WindowManager(9840):位于android.app.Dialog.show(Dialog.java:278)
E/WindowManager(9840):位于com.main.LoginConnection.getRegisterId(LoginConnection.java:281)
E/WindowManager(9840):位于com.main.LoginConnection.onCreate(LoginConnection.java:101)
E/WindowManager(9840):位于android.app.Activity.performCreate(Activity.java:4465)
E/WindowManager(9840):位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
E/WindowManager(9840):位于android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
E/WindowManager(9840):位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
E/WindowManager(9840):在android.app.ActivityThread.access$600(ActivityThread.java:123)
E/WindowManager(9840):位于android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
E/WindowManager(9840):位于android.os.Handler.dispatchMessage(Handler.java:99)
E/WindowManager(9840):位于android.os.Looper.loop(Looper.java:137)
E/WindowManager(9840):位于android.app.ActivityThread.main(ActivityThread.java:4424)
E/WindowManager(9840):位于java.lang.reflect.Method.Invokenactive(本机方法)
E/WindowManager(9840):位于java.lang.reflect.Method.invoke(Method.java:511)
E/WindowManager(9840):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/WindowManager(9840):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/WindowManager(9840):位于dalvik.system.NativeStart.main(本机方法)
E/WindowManager(9840):活动com.main.LoginConnection已泄漏window com.android.internal.policy.impl.PhoneWindow$DecorView@41162188原来是加在这里的
E/WindowManager(9840):android.view.WindowLeaked:Activity com.main.LoginConnection已泄漏window com.android.internal.policy.impl.PhoneWindow$DecorView@41162188原来是加在这里的
E/WindowManager(9840):位于android.view.ViewRootImpl(ViewRootImpl.java:344)
E/WindowManager(9840):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
E/WindowManager(9840):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
E/WindowManager(9840):位于android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
E/WindowManager(9840):位于android.view.Window$LocalWindowManager.addView(Window.java:537)
E/WindowManager(9840):位于android.app.Dialog.show(Dialog.java:278)
E/WindowManager(9840):位于com.Tools.UtilClass.openSettingApp(UtilClass.java:557)
E/WindowManager(9840):位于com.Tools.UtilClass$4.onClick(UtilClass.java:383)
E/WindowManager(9840):位于com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
E/WindowManager(9840):位于android.os.Handler.dispatchMessage(Handler.java:99)
E/WindowManager(9840):位于android.os.Looper.loop(Looper.java:137)
E/WindowManager(9840):位于android.app.ActivityThread.main(ActivityThread.java:4424)
E/WindowManager(9840):位于java.lang.reflect.Method.Invokenactive(本机方法)
E/WindowManager(9840):位于java.lang.reflect.Method.invoke(Method.java:511)
E/WindowManager(9840):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/WindowManager(9840):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/WindowManager(9840):位于dalvik.system.NativeStart.main(本机方法)

所以我不明白为什么会出现这个错误…

首先,我建议使用
NotificationCompat.Builder
,而不仅仅是
Notification.Builder
——这可能是您遇到的第一个问题(是否忽略警告?)。您将需要应用程序compat v7和支持v4库

其次,你不会看到通知。通知需要以下内容才能实际发布:

  • 内容标题
  • 内容文本
  • 内容意图
  • 小图标
  • 要查看您的通知,请添加一个content Intent
    setContentIntent(pendingent.getActivity(context,0,new Intent(),pendingent.FLAG_ONE_SHOT))
    和一个小图标
    setSmallIcon(android.R.drawable.ic_notification_clear_all
    ,然后您就可以发布它了

    通过进行这些修改,您的代码对我有效。您还有一些其他问题,特别是在完成后,您的下载通知不会被删除,但这很简单,只需将
    notify(100
    调用更改为
    notify即可(0
    ,您在那里传递的数字是通知id,因此如果要替换进度id,则它们需要匹配


    我没有修复您的内存泄漏,这是一个没有挂起线程中的活动上下文的问题。

    我喜欢NOtificationCompat.Builder,但如果我输入此代码,我在setProgress方法上会出现错误“此方法未定义…”。因此,如果我在ANdro上使用此代码,该怎么办
    E/WindowManager(9840): Activity com.main.LoginConnection has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@410c2238 that was originally added here
    E/WindowManager(9840): android.view.WindowLeaked: Activity com.main.LoginConnection has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@410c2238 that was originally added here
    E/WindowManager(9840):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:344)
    E/WindowManager(9840):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
    E/WindowManager(9840):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
    E/WindowManager(9840):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
    E/WindowManager(9840):  at android.view.Window$LocalWindowManager.addView(Window.java:537)
    E/WindowManager(9840):  at android.app.Dialog.show(Dialog.java:278)
    E/WindowManager(9840):  at com.main.LoginConnection.getRegisterId(LoginConnection.java:281)
    E/WindowManager(9840):  at com.main.LoginConnection.onCreate(LoginConnection.java:101)
    E/WindowManager(9840):  at android.app.Activity.performCreate(Activity.java:4465)
    E/WindowManager(9840):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    E/WindowManager(9840):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
    E/WindowManager(9840):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
    E/WindowManager(9840):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
    E/WindowManager(9840):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
    E/WindowManager(9840):  at android.os.Handler.dispatchMessage(Handler.java:99)
    E/WindowManager(9840):  at android.os.Looper.loop(Looper.java:137)
    E/WindowManager(9840):  at android.app.ActivityThread.main(ActivityThread.java:4424)
    E/WindowManager(9840):  at java.lang.reflect.Method.invokeNative(Native Method)
    E/WindowManager(9840):  at java.lang.reflect.Method.invoke(Method.java:511)
    E/WindowManager(9840):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    E/WindowManager(9840):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    E/WindowManager(9840):  at dalvik.system.NativeStart.main(Native Method)
    E/WindowManager(9840): Activity com.main.LoginConnection has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41162188 that was originally added here
    E/WindowManager(9840): android.view.WindowLeaked: Activity com.main.LoginConnection has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41162188 that was originally added here
    E/WindowManager(9840):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:344)
    E/WindowManager(9840):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
    E/WindowManager(9840):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
    E/WindowManager(9840):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
    E/WindowManager(9840):  at android.view.Window$LocalWindowManager.addView(Window.java:537)
    E/WindowManager(9840):  at android.app.Dialog.show(Dialog.java:278)
    E/WindowManager(9840):  at com.Tools.UtilClass.openSettingApp(UtilClass.java:557)
    E/WindowManager(9840):  at com.Tools.UtilClass$4.onClick(UtilClass.java:383)
    E/WindowManager(9840):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
    E/WindowManager(9840):  at android.os.Handler.dispatchMessage(Handler.java:99)
    E/WindowManager(9840):  at android.os.Looper.loop(Looper.java:137)
    E/WindowManager(9840):  at android.app.ActivityThread.main(ActivityThread.java:4424)
    E/WindowManager(9840):  at java.lang.reflect.Method.invokeNative(Native Method)
    E/WindowManager(9840):  at java.lang.reflect.Method.invoke(Method.java:511)
    E/WindowManager(9840):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    E/WindowManager(9840):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    E/WindowManager(9840):  at dalvik.system.NativeStart.main(Native Method)