无法添加Android的窗口对话框 [英] Unable to add window Android dialog box

查看:201
本文介绍了无法添加Android的窗口对话框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先,用户输入自己的用户名和密码,然后应用程序从API获取数据的列表。

我试图显示一个对话框,而应用程序是从API同步数据,但我发现了以下错误:

日志:

 错误07-03 14:12:29.791 24439-24439 / com.rep E / AndroidRuntime:致命异常:主要
    android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌null不是一个应用程序
            在android.view.ViewRootImpl.setView(ViewRootImpl.java:571)
            在android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246)
            在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            在android.app.Dialog.show(Dialog.java:281)
            在com.app.login.LoginActivity $ SincronizarTask。(LoginActivity.java:292)
            在com.app.login.LoginActivity $ AutenticacaoLocalTask​​.onPostExecute(LoginActivity.java:248)
            在com.app.login.LoginActivity $ AutenticacaoLocalTask​​.onPostExecute(LoginActivity.java:163)
            在android.os.AsyncTask.finish(AsyncTask.java:631)
            在android.os.AsyncTask.access $ 600(AsyncTask.java:177)
            在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:644)
            在android.os.Handler.dispatchMessage(Handler.java:99)
            在android.os.Looper.loop(Looper.java:137)
            在android.app.ActivityThread.main(ActivityThread.java:5226)
            在java.lang.reflect.Method.invokeNative(本机方法)
            在java.lang.reflect.Method.invoke(Method.java:511)
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:795)
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
            在dalvik.system.NativeStart.main(本机方法)

的同步类:

 公共类SincronizarTask扩展的AsyncTask {私人最终ProgressDialog对话框;
私人上下文CTX;
私人ProgressDialog mProgressDialog;
私人Sincronizar mSincronizar =新Sincronizar(this.ctx);公共SincronizarTask(上下文活动){CTX =活动;
mSincronizar =新Sincronizar(CTX);对话框=新ProgressDialog(CTX);
dialog.setCancelable(假);
dialog.setTitle(Sincronizando);
dialog.setMessage(Aguarde ......);如果(!dialog.isShowing()){
dialog.show();
}}@覆盖
在preExecute保护无效(){
super.on preExecute();
Log.i(关于preExecute,RM);
}@覆盖
保护布尔doInBackground(虚空...... PARAMS){Log.i(RM,doInBackground);尝试{
ClientesRest mClientesRest =新ClientesRest(this.ctx);Log.i(RM,doInBackground:P1);mClientesRest.getClientes(新ClientesRest.ClientesRestListener(){
公共无效clientesReceived(名单clientes){
Log.i(RM,doInBackground:P:2);
Log.i(RM,将String.valueOf(clientes));
Log.i(RM,doInBackground:P:3);
}
});
}赶上(例外五){
e.printStackTrace();
}返回true;}@覆盖
保护无效onPostExecute(最终布尔成功){
dialog.dismiss();
}@覆盖
保护无效onCancelled(){
mAutenticacaoLocalTask​​ = NULL;
dialog.dismiss();
}}

该ClientRest类:

 进口android.content.Context;
进口android.util.Log;进口com.model.ClienteModel;
进口com.webservice.Servidor;
进口com.webservice.volley.AuthFailureError;
进口com.webservice.volley.Request;
进口com.webservice.volley.RequestQueue;
进口com.webservice.volley.Response;
进口com.webservice.volley.VolleyError;
进口com.webservice.volley.toolbox.JsonObjectRequest;
进口com.webservice.volley.toolbox.Volley;进口org.json.JSONArray;
进口org.json.JSONException;
进口org.json.JSONObject;进口的java.util.ArrayList;
进口的java.util.HashMap;
进口的java.util.List;
进口的java.util.Map;进口静态java.lang.String.valueOf;公共类ClientesRest扩展Servidor {    私人字符串recursoRest =clientes;    私人请求队列mRequestQueue;    私人上下文的背景下;    公共ClientesRest(上下文CTX){
        this.context = CTX;
    }    公共接口ClientesRestListener {
        公共无效clientesReceived(列表< ClienteModel> clientes);
    }    公众最终无效getClientes(最终ClientesRestListener监听){        字符串URL = this.URL_WS + recursoRest;
        mRequestQueue = Volley.newRequestQueue(this.context);        JsonObjectRequest mJsonObjectRequest =新JsonObjectRequest(Request.Method.GET,网址,空,新Response.Listener<&JSONObject的GT;(){            @覆盖
            公共无效onResponse(JSONObject的响应){
                清单< ClienteModel> clientes = NULL;
                尝试{
                    clientes = parseJSON(响应);
                }赶上(JSONException E){
                    e.printStackTrace();
                   // Log.i(RM,将String.valueOf(e.getStackTrace()));
                }
                listener.clientesReceived(clientes);
            }        },新Response.ErrorListener(){            @覆盖
            公共无效onErrorResponse(VolleyError错误){
                Log.i(RM,error.getMessage());
            }        }
        ){
            @覆盖
            公共地图<字符串,字符串> getHeaders()抛出AuthFailureError {
                HashMap的<字符串,字符串>标题=新的HashMap<字符串,字符串>();
                headers.put(X - 令牌,xxxxxxxxxxxxxxxxxxxxxxxx);
                返回头;
            }
        };        mRequestQueue.add(mJsonObjectRequest);
    }    私人列表< ClienteModel> parseJSON(JSONObject的JSON)抛出JSONException {        Log.i(RM,executouÒparseJSON);            / *数组第armazenar OS clientes * /
        ArrayList的< ClienteModel> arrayClientes =新的ArrayList< ClienteModel>();            / * PEGAØ阵dados阙VEM呐resposta达CONSULTA AO休息* /
        JSONArray dados = json.getJSONArray(dados);            / * percorreØ数组* /
        的for(int i = 0; I< dados.length();我++){                / * PEGA一个posição德CADA linha没有数组* /
            JSONObject的项目= dados.getJSONObject(I)                / * CRIA UM objeto做TIPO ClienteModel * /
            ClienteModel mClienteModel =新ClienteModel();                / * cadastra OS dadosnecessários没有objeto mClienteModel * /
            mClienteModel.set_idrm(的Integer.parseInt(item.optString(ID)));
            mClienteModel.set_nome(item.optString(诺姆));
            mClienteModel.set_tipo(item.getString(TIPO));
            mClienteModel.set_endereco(item.optString(endereco));
            mClienteModel.set_numero(item.optString(NUMERO));
            mClienteModel.set_complemento(item.optString(补语));
            mClienteModel.set_cep(item.optString(CEP));
            mClienteModel.set_bairro(item.optString(上城区));
            mClienteModel.set_cidade(item.optString(CIDADE));
            mClienteModel.set_estado(item.optString(国家体制));
            mClienteModel.set_informacao_adicional(informacao_adicional);            / * adicionarØobjeto mClienteModel没有数组德ClientesarrayClientes* /
            arrayClientes.add(mClienteModel);
        }        返回arrayClientes;    }
}


解决方案

私人Sincronizar mSincronizar =新Sincronizar(this.ctx);

它替换为

私人Sincronizar mSincronizar;

First the user enter his username and password, then the app gets a list of data from an API.

I'm trying to show a dialog box while the the app is synchronizing the data from an API, but I'm getting the following error:

Log:

ERROR

07-03 14:12:29.791  24439-24439/com.rep E/AndroidRuntime﹕ FATAL EXCEPTION: main
    android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
            at android.view.ViewRootImpl.setView(ViewRootImpl.java:571)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.app.Dialog.show(Dialog.java:281)
            at com.app.login.LoginActivity$SincronizarTask.(LoginActivity.java:292)
            at com.app.login.LoginActivity$AutenticacaoLocalTask.onPostExecute(LoginActivity.java:248)
            at com.app.login.LoginActivity$AutenticacaoLocalTask.onPostExecute(LoginActivity.java:163)
            at android.os.AsyncTask.finish(AsyncTask.java:631)
            at android.os.AsyncTask.access$600(AsyncTask.java:177)
            at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5226)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
            at dalvik.system.NativeStart.main(Native Method)

The Sync class:

 public class SincronizarTask extends AsyncTask {

        private final ProgressDialog dialog;
        private Context ctx;
        private ProgressDialog mProgressDialog;
        private Sincronizar mSincronizar = new Sincronizar(this.ctx);

        public SincronizarTask(Context activity) {

            ctx = activity;
            mSincronizar = new Sincronizar(ctx);

            dialog = new ProgressDialog(ctx);
            dialog.setCancelable(false);
            dialog.setTitle("Sincronizando");
            dialog.setMessage("Aguarde...");

            if (!dialog.isShowing()) {
                dialog.show();
            }

        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.i("RM", "onPreExecute");
        }

        @Override
        protected Boolean doInBackground(Void... params) {

            Log.i("RM", "doInBackground");

            try {
                ClientesRest mClientesRest = new ClientesRest(this.ctx);

                Log.i("RM", "doInBackground : P1");

                mClientesRest.getClientes(new ClientesRest.ClientesRestListener() {
                    public void clientesReceived(List clientes) {
                        Log.i("RM", "doInBackground : P:2");
                        Log.i("RM", String.valueOf(clientes));
                        Log.i("RM", "doInBackground : P:3");
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }

            return true;

        }

        @Override
        protected void onPostExecute(final Boolean success) {
            dialog.dismiss();
        }

        @Override
        protected void onCancelled() {
            mAutenticacaoLocalTask = null;
            dialog.dismiss();
        }

    }

The ClientRest class:

import android.content.Context;
import android.util.Log;

import com.model.ClienteModel;
import com.webservice.Servidor;
import com.webservice.volley.AuthFailureError;
import com.webservice.volley.Request;
import com.webservice.volley.RequestQueue;
import com.webservice.volley.Response;
import com.webservice.volley.VolleyError;
import com.webservice.volley.toolbox.JsonObjectRequest;
import com.webservice.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static java.lang.String.valueOf;

public class ClientesRest extends Servidor {

    private String recursoRest = "clientes";

    private RequestQueue mRequestQueue;

    private Context context;

    public ClientesRest(Context ctx) {
        this.context = ctx;
    }

    public interface ClientesRestListener {
        public void clientesReceived(List<ClienteModel> clientes);
    }

    public final void getClientes(final ClientesRestListener listener) {

        String url = this.URL_WS + recursoRest;
        mRequestQueue = Volley.newRequestQueue(this.context);

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

            @Override
            public void onResponse(JSONObject response) {
                List<ClienteModel> clientes = null;
                try {
                    clientes = parseJSON(response);
                } catch (JSONException e) {
                    e.printStackTrace();
                   // Log.i("RM", String.valueOf(e.getStackTrace()));
                }
                listener.clientesReceived(clientes);
            }

        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.i("RM", error.getMessage());
            }

        }
        ) {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("X--TOKEN", "xxxxxxxxxxxxxxxxxxxxxxxx");
                return headers;
            }
        };

        mRequestQueue.add(mJsonObjectRequest);
    }

    private List<ClienteModel> parseJSON(JSONObject json) throws JSONException {

        Log.i("RM", "executou o parseJSON");

            /* array para armazenar os clientes */
        ArrayList<ClienteModel> arrayClientes = new ArrayList<ClienteModel>();

            /* pega o array "dados" que vem na resposta da consulta ao rest */
        JSONArray dados = json.getJSONArray("dados");

            /* percorre o array */
        for (int i = 0; i < dados.length(); i++) {

                /* pega a posição de cada linha no array */
            JSONObject item = dados.getJSONObject(i);

                /* cria um objeto do tipo ClienteModel */
            ClienteModel mClienteModel = new ClienteModel();

                /* cadastra os dados necessários no objeto mClienteModel */
            mClienteModel.set_idrm(Integer.parseInt(item.optString("id")));
            mClienteModel.set_nome(item.optString("nome"));
            mClienteModel.set_tipo(item.getString("tipo"));
            mClienteModel.set_endereco(item.optString("endereco"));
            mClienteModel.set_numero(item.optString("numero"));
            mClienteModel.set_complemento(item.optString("complemento"));
            mClienteModel.set_cep(item.optString("cep"));
            mClienteModel.set_bairro(item.optString("bairro"));
            mClienteModel.set_cidade(item.optString("cidade"));
            mClienteModel.set_estado(item.optString("estado"));
            mClienteModel.set_informacao_adicional("informacao_adicional");

            /* adicionar o objeto mClienteModel no array de Clientes "arrayClientes" */
            arrayClientes.add(mClienteModel);
        }

        return arrayClientes;

    }
}

解决方案

private Sincronizar mSincronizar = new Sincronizar(this.ctx);

replace it with

private Sincronizar mSincronizar;

这篇关于无法添加Android的窗口对话框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆