【问题标题】:Fatal Exception ProgressDialog android studio致命异常 ProgressDialog android studio
【发布时间】:2017-08-02 08:49:55
【问题描述】:

我正在尝试通过 android studio 中的 volley 获取数据 json,类名 obs_bgw,我的代码工作正常,但是在 1 分钟后运行应用程序时自动刷新应用程序不起作用,我检查了 firebase 崩溃中的错误是

 Exception android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@cc00538 is not valid; is your activity running?
    android.view.ViewRootImpl.setView (ViewRootImpl.java:903)
    android.view.WindowManagerGlobal.addView (WindowManagerGlobal.java:377)
    android.view.WindowManagerImpl.addView (WindowManagerImpl.java:97)
    android.app.Dialog.show (Dialog.java:408)
    android.app.ProgressDialog.show (ProgressDialog.java:151)
    android.app.ProgressDialog.show (ProgressDialog.java:134)
    android.app.ProgressDialog.show (ProgressDialog.java:129)
    net.myaapp.app.weatherapp.obs_bgw.sendjsonrequest (obs_bgw.java:51)
    net.myaapp.app.weatherapp.obs_bgw$3.run (obs_bgw.java:88)
    android.os.Handler.handleCallback (Handler.java:751)
    android.os.Handler.dispatchMessage (Handler.java:95)
    android.os.Looper.loop (Looper.java:154)
    android.app.ActivityThread.main (ActivityThread.java:6776)
    java.lang.reflect.Method.invoke (Method.java)
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1496)
    com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1386)

我的代码

package net.myaapp.app.weatherapp;

import android.app.ProgressDialog;
import android.os.Handler;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.json.JSONException;
import org.json.JSONObject;

public class obs_bgw extends AppCompatActivity {
    RequestQueue rq;
    TextView timeDesc, tempDesc, windspeedDesc, windguestDesc, humdityDesc,pressuresDesc;
    int ages;
    int temp;
    int windspeed;
    int windguest;
    int humdity;
    double pressure;
    long timeupdate;

    String url = "station=I1410&units=metric&v=2.0&format=json";
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bgw_obs);

        rq = Volley.newRequestQueue(this);

        timeDesc = (TextView) findViewById(R.id.timeupdateDesc);
        tempDesc = (TextView) findViewById(R.id.tempid);
        windspeedDesc = (TextView) findViewById(R.id.windid);
        windguestDesc = (TextView) findViewById(R.id.windgustid);
        humdityDesc = (TextView) findViewById(R.id.humdid);
        pressuresDesc = (TextView) findViewById(R.id.pressuresDesc);

        sendjsonrequest();
    }

    public void sendjsonrequest() {
        final ProgressDialog dialog = ProgressDialog.show(this,null, "Please Wait");

        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {

                dialog.dismiss();
                try {

                    JSONObject stationsJO = response.getJSONObject("stations");
                    JSONObject I1410JO = stationsJO.getJSONObject("I1410");
                    temp = I1410JO.getInt("temperature");
                    windspeed = I1410JO.getInt("wind_speed");
                    windguest = I1410JO.getInt("wind_gust_speed");
                    humdity = I1410JO.getInt("humidity");
                    timeupdate = I1410JO.getLong("updated") * 1000L;
                    pressure = I1410JO.getDouble("pressure");

                    tempDesc.setText(Integer.toString(temp)+" C");
                    windspeedDesc.setText(Integer.toString(windspeed)+"  كم ");
                    windguestDesc.setText(Integer.toString(windguest)+"  كم ");
                    humdityDesc.setText(Integer.toString(humdity)+"  % ");
                    pressuresDesc.setText(Integer.toString((int) pressure)+" in ");
                    timeDesc.setText(getDate(timeupdate));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                dialog.dismiss();
            }
        });
        rq.add(jsonObjectRequest);
        final Handler handler = new Handler();
        final Runnable runnable = new Runnable() {
            @Override
            public void run() {
                sendjsonrequest();
                handler.postDelayed(this, 60000);//60 second delay
            }
        };
        handler.postDelayed(runnable, 60000);
    }

    private String getDate(long timeStamp) {
        try {
            DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss");
            Date netDate = (new Date(timeStamp));
            return sdf.format(netDate);
        } catch (Exception ex) {
            return "xx";
        }
    }


}

问题在于进度对话框,第 51 行 final ProgressDialog dialog = ProgressDialog.show(this,null, "Please Wait"); 当他刷新日期停止工作时

【问题讨论】:

  • 你泄露了处理程序......即使活动关闭,它仍然处于活动状态,你必须在离开活动之前取消处理程序的工作
  • 所以我必须删除刷新代码,导致他的内容处理程序的
  • 不,你必须在谷歌上搜索“取消 Handler 的工作”
  • 在暂停/OnDestroy 中写下这个 if(progressDialog!=null)progressDialog.dismiss 离开活动时
  • 用于删除回调 if (handler != null && runnable != null) { handler.removeCallbacks(runnable); }

标签: android progressdialog


【解决方案1】:

请检查以下条件

  1. 用于 onPause/onDestroy 中的 ProgressDialog

      if (progressDialog != null) progressDialog.dismiss();
    
  2. 用于移除 onPause/onDestroy 中的处理程序回调

        if (handler != null && runnable != null) {
                handler.removeCallbacks(runnable);
            }
    
  3. 请根据您的情况这样写,否则处理程序将采用多个实例:

        Runnable runnable;
        final Handler handler = new Handler();
        if (runnable != null) {
         handler.removeCallbacks(runnable);
        }
        runnable = new Runnable() {
                @Override
                public void run() {
                    sendjsonrequest();
                    handler.postDelayed(this, 60000);//60 second delay
                }
            };
            handler.postDelayed(runnable, 60000);
    

【讨论】:

    【解决方案2】:

    在外部创建进度对话框实例并在调用 web 服务时显示它。任务完成后,隐藏进度对话框。

    在顶部声明对话框

    private ProgressDialog progressDialog;
    

    在 onCreate 中创建它的实例。

        progressDialog = new ProgressDialog(this);
        progressDialog.setCancelable(false);
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.setTitle("Loading...");
    

    在 webservice 调用方法中显示对话框。

    public void sendjsonrequest() {
    
    progressDialog.show();
    
    }
    

    在 onResponse 和 onErrorResponse 中,关闭对话框。

       dialog.dismiss();
    

    【讨论】:

    • 又一个Million Monkeys Programming Style 的例子你明白他的代码吗?他在 60 秒后再次调用 sendjsonrequest。 callinf show on dissmised Dialog 不是一个好习惯……真正的问题在于 Handler - Activity 关闭后它仍在工作
    • 哦,我没看到。
    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多