【问题标题】:display progress dialog when touching item on list view触摸列表视图上的项目时显示进度对话框
【发布时间】:2014-09-08 10:29:38
【问题描述】:

我有一个列表视图,我希望当我触摸列表视图上的项目时,我的进度对话框会打开并显示加载消息。 一切都很好,但是当我触摸项目以查看对话框时,我的应用程序崩溃了。但如果我滚动列表,然后触摸项目,我的应用程序确实会出错。 当从网络收集并显示数据时,我会在下一个活动中关闭对话框。

这是我的列表视图填充鳕鱼

 public void fill(final ArrayAdapter<RssParser.Item> adapter, final RssParser.Item item, final int position)
    {

        try
        {

            Thread thread = new Thread(new Runnable() {

                @Override
                public void run() {
                    RecruitmentActivity.handler.post(new Runnable() {

                        @Override
                        public void run() {
                            ActivityFirst.dismissLoadingDialog();
                            txtTitle.setText(item.title);
                            txtDate.setText(item.pubDate);
                            txt_time.setText(item.time);
                            txtDescription.setText(item.description);
                            layoutRoot.setOnClickListener(new OnClickListener() {

                                @Override
                                public void onClick(View v) {

                                    ((Activity) context).runOnUiThread(new Runnable() {

                                        @Override
                                        public void run() {
                                            if (progress == null) {
                                                progress = new ProgressDialog(context);
                                                progress.setTitle("title");
                                                progress.setMessage("loading");
                                                progress.setCanceledOnTouchOutside(false);
                                                progress.setCancelable(false);
                                            }
                                            progress.show();
                                            G.SelectedApplication = item;
                                            Intent intent = new Intent(G.context, Adapter_Description.class)
                                                    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                            intent.putExtra("INPUT", item.link + "");
                                            intent.putExtra("INPUT_DESC", item.description + "");
                                            G.context.startActivity(intent);
                                        }
                                    });
                                }
                            });

                        }

                    });
                }
            });

            thread.start();

这是我的解雇方法

public static void dismissLoadingDialog() {

    if (progress != null && progress.isShowing()) {
        progress.dismiss();
    }
}

这是我的日志

09-07 20:44:23.227:E/AndroidRuntime(1461):致命异常:主要 09-07 20:44:23.227: E/AndroidRuntime(1461): android.view.WindowManager$BadTokenException: 无法添加窗口——令牌 android.os.BinderProxy@a65f2178 无效;您的活动正在运行吗? 09-07 20:44:23.227: E/AndroidRuntime(1461):
在 android.view.ViewRootImpl.setView(ViewRootImpl.java:567) 09-07 20:44:23.227: E/AndroidRuntime(1461):
在 android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246) 09-07 20:44:23.227: E/AndroidRuntime(1461):
在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 09-07 20:44:23.227: E/AndroidRuntime(1461): ** 在 android.app.Dialog.show(Dialog.java:281) 09-07 20:44:23.227: E/AndroidRuntime(1461):
com.employment.app.find_work.recruitment.AdapterItems$ViewHolder$1$1$1.onClick(AdapterItems.java:89 09-07 20:44:23.227: E/AndroidRuntime(1461):
在 android.view.View.performClick(View.java:4204)
09-07 20:44:23.227: E/AndroidRuntime(1461):**
在 android.view.View$PerformClick.run(View.java:17355) 09-07 20:44:23.227: E/AndroidRuntime(1461):
在 android.os.Handler.handleCallback(Handler.java:725) 09-07 20:44:23.227: E/AndroidRuntime(1461):
在 android.os.Handler.dispatchMessage(Handler.java:92) 09-07 20:44:23.227: E/AndroidRuntime(1461):
在 android.os.Looper.loop(Looper.java:137) 09-07 20:44:23.227: E/AndroidRuntime(1461):
在 android.app.ActivityThread.main(ActivityThread.java:5041) 09-07 20:44:23.227: E/AndroidRuntime(1461):
在 java.lang.reflect.Method.invokeNative(Native Method) 09-07 20:44:23.227: E/AndroidRuntime(1461):
在 java.lang.reflect.Method.invoke(Method.java:511) 09-07 20:44:23.227: E/AndroidRuntime(1461):
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 09-07 20:44:23.227: E/AndroidRuntime(1461):
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 09-07 20:44:23.227: E/AndroidRuntime(1461):
在 dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 您正在使用一个不再存在的上下文。
  • 你点击了线程,所以它抛出错误。当用户点击Handle中的传递数据时。

标签: android listview progressdialog


【解决方案1】:

中添加代码点击事件代码
your_activity_name.runOnUiThread(new Runnable() {
        @Override
        public void run() {
             if (progress == null) {
                        progress = new ProgressDialog(context);
                        progress.setTitle("title");
                        progress.setMessage("loading");
                        progress.setCanceledOnTouchOutside(false);
                        progress.setCancelable(false);
              }
              progress.show();
              G.SelectedApplication = item;
              Intent intent = new Intent(G.context, Adapter_Description.class)
                     .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              intent.putExtra("INPUT", item.link + "");
              intent.putExtra("INPUT_DESC", item.description + "");
              G.context.startActivity(intent);
        }
    });

将您的代码放入运行方法中。

【讨论】:

  • 我没有活动,这是我的课。我的类是在 ArrayAdapter 中扩展的 AdapterItem 可以吗?
  • @user3453159 是的,没关系。在那个 context.runOnUiThread(); 中传递你的上下文
  • 非常感谢,但我是 android 新手,但我仍然有错误,请查看我编辑的帖子。
  • @user3453159 你可以在 onlick 方法中使用 RecruitmentActivity.handler.post。
【解决方案2】:

1) 确保“上下文”变量指向 Activity 而不是其他变量。

2) 非常有趣,因为在这种情况下,您应该得到“无法触摸视图”异常,而不是错误的窗口绑定器令牌异常。 有可能:

  • 如前所述,您的应用程序已经死机(即过去的 onPause() )。

  • 由于线程嵌套混乱,您在 UI 线程之外触摸 UI 控件,这是唯一可以修改视图的控件。尝试: runOnUiThread(new Runnable() {

    @Override
    public void onClick(View v)  {
        runOnUiThread(new Runnable() {
            // Your code related to controlling the progress bar
        })
    }
    

    您还可以使用处理程序来通知视图(这实际上更可取)

3) 确保在旧 Activity 终止之前关闭对话框。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多