2017-08-02 64 views
-3

我想通过在android工作室,类名obs_bgw,我的代码工作正常,但1分钟后运行应用程序自动刷新应用程序不工作,我检查在Firebase崩溃错误是致命的异常ProgressDialog android studio

Exception android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] 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");当他刷新日期停止工作

+0

您泄漏处理程序...它仍然活跃,即使活动是密切,你必须之前取消Handler的工作离开活动 – Selvin

+0

所以我不得不删除代码的刷新,导致他的内容处理程序的 –

+0

不,你必须谷歌“取消处理程序的工作” – Selvin

回答

-1

异常android.view.WindowManager $ BadTokenException:无法添加 窗口 - 令牌[email protected]无效;你的 活动正在运行?

  1. WindowManager$BadTokenException

按如下步骤

final ProgressDialog dialog = ProgressDialog.show(obs_bgw.this,null, "Please Wait"); 
  • ProgressDialogGLOBAL变量。

    添加方法。

    @Override 
    public void onPause() { 
    super.onPause(); 
    if (dialog.isShowing()) 
    { 
        dialog.dismiss(); 
    } 
    
  • +0

    很好的[百万猴编程风格](https://en.wikipedia.org/wiki/Programming_by_permutation)的例子...显然它不会像'obs_bgw.this = = this'在这种情况下 – Selvin

    -1

    之外创建进度对话框实例,并展示它,而调用web服务。一旦完成任务,隐藏进度对话框。在顶部

    private ProgressDialog progressDialog; 
    

    申报对话框在OnCreate创建它的实例。

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

    显示web服务调用方法中的对话框。

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

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

    dialog.dismiss(); 
    
    +0

    [百万猴编程风格]的另一个例子(https://en.wikipedia.org/wiki/Programming_by_permutation)你知道他的代码吗?他在60秒后再次调用sendjsonrequest。 callinf显示dismised对话框不是一个好习惯......真正的问题是处理程序 - 它仍然工作后活动关闭 – Selvin

    +0

    哦,我还没有看到。 –

    0

    请检查以下条件

    1. 对于ProgressDialog中的onPause /的onDestroy

      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);