无法使用AsyncTask显示ProgressDialog

时间:2012-05-22 14:37:37

标签: android multithreading progress-bar android-asynctask progressdialog

我想在等待服务器响应时显示ProgressDialog。

我的课程JogarActivity执行以下操作(我的应用程序是一个测验游戏):

1-初始化变量

2-验证是否是第一个问题(primeiraPergunta)

2.1-如果这是第一个问题,请调用UserFunctions.getJogar()。此函数使用参数构建一个列表并将其发送到JSONParser类。 JSONParser发出http请求并返回带有数据的JSONArray

2.2-如果不是第一个问题,只需从意图附加内容中检索实际问题。

3-尝试将JSONArray解析为字符串。如果用户已经回答了实际类别中的所有问题,则会返回异常(JSONArray将为null),因此它可以显示一个对话框,要求用户选择另一个类别。

4-在屏幕上显示所有数据(问答选项)并等待用户的交互。

5-当用户选择答案时,它会调用UserFunctions.gerResposta()。这次,它将在更新数据库(ponctuation,回答问题等)后返回状态消息(正确,错误,错误等)。它还将检索下一个问题。

6-显示一个对话框,其中包含有关问题的信息和一个确定按钮,按下此按钮可重新启动活动。下一个问题是作为intent.putExtra()传递的,而primeiraPergunta(第一个问题?)被设置为false。

* UserFunctions和JSONParser不是活动,因此我不能在其中使用ProgressDialog,只要我无法检索应用程序的上下文。 * JSONParser被其他类使用,所以我不想更改它 *我正在寻找另一种解决方案,而不是在JogarActivity中重写任务(这也有必要改变其他类)。

首先,我已经粘贴了JogarActivity而没有任何变化。然后,我尝试添加一个AsyncTask来显示ProgressDialog,但它不会出现在屏幕上(AsyncTask.get()用于使JogarActivity等待asynctask的结果)。 Finnaly,我已经粘贴了另一个类(RegisterActivity),其中AsyncTask工作正常。

我猜AsyncTask可能不是最好的方法,但我只想让它尽快运行。这不是我的代码(RegisterActivity除外)。应用程序工作后,我将优化它:)

========== JogarActivity.java ====================

public class JogarActivity  extends Activity {

private static final String TAG_RESPOSTA = "resposta";
private static final String TAG_ID = "idt";
private static final String TAG_PRIMEIRAPERGUNTA = "primeiraPergunta";
private static final String TAG_JSON = "json";
private Integer idPergunta;
private String pergunta;
private String respostaRecebe; //Texto da resposta que o usuário escolheu
private String respostaConfere;
private String resposta;
private String idCategoria;
private String respostaCorreta;
private String[] arrayRespostas = new String[5];
private boolean primeiraPergunta;
private JSONArray json;
private JSONArray jsonResposta;
String idUser;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);





    setContentView(R.layout.jogar_layout);
    Intent in = getIntent();
    String url = this.getString(R.string.urlSite);
    ArrayList<HashMap<String, String>> respostaList = new ArrayList<HashMap<String, String>>();

    String idt = in.getStringExtra(TAG_ID);
    primeiraPergunta = in.getBooleanExtra(TAG_PRIMEIRAPERGUNTA, true);

    TextView insertPergunta = (TextView) findViewById(R.id.insertPergunta);
    ListView insertRespostas = (ListView) findViewById(R.id.listResposta);

    SharedPreferences settings = getSharedPreferences("PREFS_LOGIN", MODE_PRIVATE);
    Integer idUsuario = settings.getInt("idUsuario", 0);
    idUser = idUsuario.toString();


    if (primeiraPergunta){
        UserFunctions userFunction = new UserFunctions();
        json = userFunction.getJogar(idt, idUser);

    }else{
        try {
            json = new JSONArray(in.getStringExtra(TAG_JSON));
            json = json.getJSONArray(2);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }




    try{
        @SuppressWarnings("unused")
        String s = json.toString(); // Se o usuário já respondeu todas as perguntas da categoria, retorna uma Exception
        try {
            idPergunta = json.getInt(0);
            pergunta = json.getString(1);
            for (int i=2; i<7 ; i++){
                resposta = json.getString(i);
                HashMap<String, String> map = new HashMap<String, String>();
                map.put(TAG_RESPOSTA, resposta);
                respostaList.add(map);
                arrayRespostas[i-2] = resposta;
            }

            respostaCorreta = json.getString(7);
            respostaConfere = arrayRespostas[Integer.parseInt(respostaCorreta)-1];
            idCategoria = json.getString(11);



        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        insertPergunta.setText(pergunta);
        ListAdapter adapter = new SimpleAdapter(this, respostaList,
                R.layout.resposta_data,
                new String[] { TAG_RESPOSTA }, new int[] {
                        R.id.insertResposta });

        insertRespostas.setAdapter(adapter);



        // selecting single ListView item
        ListView lv = insertRespostas;


        lv.setOnItemClickListener(new OnItemClickListener() {



            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id){

                Integer pos = position + 1;
                String respostaEscolhida = pos.toString();
                String pergunta = idPergunta.toString();

                UserFunctions userFunction = new UserFunctions();
                            final JSONArray jsonResposta = userFunction.getResposta(pergunta, idUser , respostaEscolhida, idCategoria);



                respostaRecebe = arrayRespostas[position];

                String mensagem = "";
                try {
                    mensagem = jsonResposta.getString(1);
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                final String jrString = jsonResposta.toString();

                AlertDialog alertDialog = new AlertDialog.Builder(
                        JogarActivity.this).create();


                    if (respostaCorreta.equals(pos.toString())){
                        alertDialog.setTitle("PARABÉNS");   
                        alertDialog.setMessage("Resposta correta: "+respostaRecebe+"\n\n"+mensagem);
                    }
                    else{
                        alertDialog.setTitle("VOCÊ ERROU");
                        alertDialog.setMessage("Sua resposta: "+respostaRecebe+"\n\nResposta correta: "+respostaConfere+"\n\n"+mensagem);

                    }
                        alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                Intent i = new Intent(getApplicationContext(),JogarActivity.class);
                                //in.putExtra(TAG_NAME, name);
                                i.putExtra(TAG_ID, idCategoria);
                                i.putExtra(TAG_PRIMEIRAPERGUNTA, false);
                                i.putExtra(TAG_JSON, jrString);
                                startActivity(i);
                                finish();
                            }
                    });

                    alertDialog.show();

                        }


        });
    }catch (Exception e){
        AlertDialog sem_perguntas = new AlertDialog.Builder(
                JogarActivity.this).create();
            sem_perguntas.setTitle("PARABÉNS"); 
            sem_perguntas.setMessage("Você já respondeu todas as perguntas desta categoria!");

            sem_perguntas.setButton("VOLTAR", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        Intent i = new Intent(getApplicationContext(),CategoriasJogarActivity.class);
                        i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                        startActivity(i);
                        finish();
                    }
            });

            sem_perguntas.show();
            //finish();
    }



   //finish(); 
}


public boolean onCreateOptionsMenu(Menu menu)
{
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.layout.menu_jogar, menu);
    return true;
}

public boolean onOptionsItemSelected(MenuItem item)
{

    switch (item.getItemId())
    {
    case R.id.menu_pularPergunta:
        Intent i = new Intent(getApplicationContext(),JogarActivity.class);
        startActivity(i);
        finish();
        Toast.makeText(JogarActivity.this, "Pergunta Pulada", Toast.LENGTH_SHORT).show();
        return true;
    }
    return false;
}

}

==============使用AsyncTask的JogarActivity(不显示ProgressDialog)=============

public class JogarActivity  extends Activity {

private static final String TAG_RESPOSTA = "resposta";
private static final String TAG_ID = "idt";
private static final String TAG_PRIMEIRAPERGUNTA = "primeiraPergunta";
private static final String TAG_JSON = "json";
private Integer idPergunta;
private String pergunta;
private String respostaRecebe; //Texto da resposta que o usuário escolheu
private String respostaConfere;
private String resposta;
private String idCategoria;
private String respostaCorreta;
private String[] arrayRespostas = new String[5];
private boolean primeiraPergunta;
private JSONArray json;
private JSONArray jsonResposta;
ProgressDialog pDialog;
Context ctx = this;
String idUser;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);





    setContentView(R.layout.jogar_layout);
    Intent in = getIntent();
    String url = this.getString(R.string.urlSite);
    ArrayList<HashMap<String, String>> respostaList = new ArrayList<HashMap<String, String>>();

    String idt = in.getStringExtra(TAG_ID);
    primeiraPergunta = in.getBooleanExtra(TAG_PRIMEIRAPERGUNTA, true);

    TextView insertPergunta = (TextView) findViewById(R.id.insertPergunta);
    ListView insertRespostas = (ListView) findViewById(R.id.listResposta);

    SharedPreferences settings = getSharedPreferences("PREFS_LOGIN", MODE_PRIVATE);
    Integer idUsuario = settings.getInt("idUsuario", 0);
    idUser = idUsuario.toString();


    if (primeiraPergunta){
        //UserFunctions userFunction = new UserFunctions();
        //json = userFunction.getJogar(idt, idUser);
        AsyncTask jogar = new Jogar().execute("url", "http://www.qranio.com/mobile/perguntas.php", "categoria", idt, "idUsuario", idUser);
        try {
            json = (JSONArray) jogar.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }else{
        try {
            json = new JSONArray(in.getStringExtra(TAG_JSON));
            json = json.getJSONArray(2);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }




    try{
        @SuppressWarnings("unused")
        String s = json.toString(); // Se o usuário já respondeu todas as perguntas da categoria, retorna uma Exception
        try {
            idPergunta = json.getInt(0);
            pergunta = json.getString(1);
            for (int i=2; i<7 ; i++){
                resposta = json.getString(i);
                HashMap<String, String> map = new HashMap<String, String>();
                map.put(TAG_RESPOSTA, resposta);
                respostaList.add(map);
                arrayRespostas[i-2] = resposta;
            }

            respostaCorreta = json.getString(7);
            respostaConfere = arrayRespostas[Integer.parseInt(respostaCorreta)-1];
            idCategoria = json.getString(11);



        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        insertPergunta.setText(pergunta);
        ListAdapter adapter = new SimpleAdapter(this, respostaList,
                R.layout.resposta_data,
                new String[] { TAG_RESPOSTA }, new int[] {
                        R.id.insertResposta });

        insertRespostas.setAdapter(adapter);



        // selecting single ListView item
        ListView lv = insertRespostas;


        lv.setOnItemClickListener(new OnItemClickListener() {



            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id){




                Integer pos = position + 1;
                String respostaEscolhida = pos.toString();
                String pergunta = idPergunta.toString();



                //UserFunctions userFunction = new UserFunctions();
                //final JSONArray jsonResposta = userFunction.getResposta(pergunta, idUser , respostaEscolhida, idCategoria);
                AsyncTask jogar = new Jogar().execute("url", "http://www.qranio.com/mobile/resposta.php", "id_pergunta", pergunta, "id_usuario", idUser, "resposta", respostaEscolhida, "categoria", idCategoria);

                try {
                    jsonResposta = (JSONArray) jogar.get();
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                } catch (ExecutionException e1) {
                    e1.printStackTrace();
                }


                respostaRecebe = arrayRespostas[position];

                String mensagem = "";
                try {
                    mensagem = jsonResposta.getString(1);
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                final String jrString = jsonResposta.toString();

                AlertDialog alertDialog = new AlertDialog.Builder(
                        JogarActivity.this).create();


                    if (respostaCorreta.equals(pos.toString())){
                        alertDialog.setTitle("PARABÉNS");   
                        alertDialog.setMessage("Resposta correta: "+respostaRecebe+"\n\n"+mensagem);
                    }
                    else{
                        alertDialog.setTitle("VOCÊ ERROU");
                        alertDialog.setMessage("Sua resposta: "+respostaRecebe+"\n\nResposta correta: "+respostaConfere+"\n\n"+mensagem);

                    }
                        alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                Intent i = new Intent(getApplicationContext(),JogarActivity.class);
                                //in.putExtra(TAG_NAME, name);
                                i.putExtra(TAG_ID, idCategoria);
                                i.putExtra(TAG_PRIMEIRAPERGUNTA, false);
                                i.putExtra(TAG_JSON, jrString);
                                startActivity(i);
                                finish();
                            }
                    });

                    alertDialog.show();

                        }


        });
    }catch (Exception e){
        AlertDialog sem_perguntas = new AlertDialog.Builder(
                JogarActivity.this).create();
            sem_perguntas.setTitle("PARABÉNS"); 
            sem_perguntas.setMessage("Você já respondeu todas as perguntas desta categoria!");

            sem_perguntas.setButton("VOLTAR", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        Intent i = new Intent(getApplicationContext(),CategoriasJogarActivity.class);
                        i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                        startActivity(i);
                        finish();
                    }
            });

            sem_perguntas.show();
            //finish();
    }



   //finish(); 
}

/*public void colocaResposta (int i, JSONArray json, ArrayList respostaList) throws JSONException{
    resposta = json.getString(i);
    HashMap<String, String> map = new HashMap<String, String>();
    map.put(TAG_RESPOSTA, resposta);
    respostaList.add(map);
}*/





public boolean onCreateOptionsMenu(Menu menu)
{
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.layout.menu_jogar, menu);
    return true;
}

public boolean onOptionsItemSelected(MenuItem item)
{

    switch (item.getItemId())
    {
    case R.id.menu_pularPergunta:
        Intent i = new Intent(getApplicationContext(),JogarActivity.class);
        startActivity(i);
        finish();
        Toast.makeText(JogarActivity.this, "Pergunta Pulada", Toast.LENGTH_SHORT).show();
        return true;
    }
    return false;
}


class Jogar extends AsyncTask<String, Void, JSONArray>{

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(ctx);
        pDialog.setMessage("Aguarde...");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(false);
        pDialog.show();

    }

    @Override
    protected JSONArray doInBackground(String... values) {
        String url = values[1];
        int count = values.length;
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        for (int i=2; i<count; i++){
            params.add(new BasicNameValuePair(values[i], values[i+1]));
            i++;
        }

    JSONParser jsonParser = new JSONParser();
    JSONArray json = jsonParser.getJSONFromUrl(url, params);

        return json;
    }

    protected void onPostExecute(JSONArray result) {
        // dismiss the dialog once done

        pDialog.dismiss();
    }

}

}

================= RegisterActivity(工作正常)======================

public class RegisterActivity extends Activity{
EditText reg_fullname;
EditText reg_email;
EditText reg_login;
EditText reg_password;
EditText reg_password2;
Spinner reg_country;
Spinner reg_genre;
EditText reg_birthday;
EditText reg_promocode;
Button btnRegister;
Context ctx = this;
ProgressDialog pDialog;
JSONArray json;
String status;
String msg;

String fullname;
String email;
String login;
String password;
String password2;
String country;
String genre;
String birthday;
String promocode;

boolean finishActivity = false;

/**
 * @see android.app.Activity#onCreate(Bundle)
 */

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.register);

    TextView loginScreen = (TextView) findViewById(R.id.link_to_login);

    loginScreen.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
                            // Closing registration screen
            // Switching to Login Screen/closing register screen
            finish();
        }
    });

    reg_fullname = (EditText) findViewById(R.id.reg_fullname);
    reg_email = (EditText) findViewById(R.id.reg_email);
    reg_login = (EditText) findViewById(R.id.reg_login);
    reg_password = (EditText) findViewById(R.id.reg_password);
    reg_password2 = (EditText) findViewById(R.id.reg_password2); //confirmação de senha
    reg_country = (Spinner) findViewById(R.id.reg_country);
    reg_genre = (Spinner) findViewById(R.id.reg_genre);
    reg_birthday = (EditText) findViewById(R.id.reg_birthday);
    reg_promocode = (EditText) findViewById(R.id.reg_promocode);

    btnRegister = (Button) findViewById(R.id.btnRegister);


    btnRegister.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            fullname = reg_fullname.getText().toString();
            email = reg_email.getText().toString();
            login = reg_login.getText().toString();
            password = reg_password.getText().toString();
            password2 = reg_password2.getText().toString();
            country = reg_country.getSelectedItem().toString();
            genre = reg_genre.getSelectedItem().toString();
            birthday = reg_birthday.getText().toString();
            promocode = reg_promocode.getText().toString();

            boolean validation = true;
            String message = "Campo de preencimento obrigatório";

            if(fullname.equalsIgnoreCase("")){
                reg_fullname.setError(message);
                validation = false;
            }
            if(email.equalsIgnoreCase("")){
                reg_email.setError(message);
                validation = false;
            }
            if(!email.matches(".*@.*")){
                reg_email.setError("O endereço de email não é válido");
                validation = false;
            }
            if(login.equalsIgnoreCase("")){
                reg_login.setError(message);
                validation = false;
            }
            if(password.equalsIgnoreCase("")){
                reg_password.setError(message);
                validation = false;
            }
            if(password2.equalsIgnoreCase("")){
                reg_password2.setError(message);
                validation = false;
            }
            if(!password.equals(password2)){
                reg_password2.setError("A confirmação de senha não confere");
                validation = false;
            }
            if(birthday.equalsIgnoreCase("")){
                reg_birthday.setError(message);
                validation = false;
            }
            SimpleDateFormat bd = new SimpleDateFormat("dd/MM/yyyy");
            if(bd.parse(birthday, new ParsePosition(0)) == null){
                reg_birthday.setError("Esta data não é válida! Preencha novamente, usando o formato dd/mm/aaaa");
                validation = false;
            }

            if(validation){
            new Register().execute();
            }

        }
    });



}


class Register extends AsyncTask<Void, Void, JSONArray>{

@Override
protected void onPreExecute() {
    super.onPreExecute();
    pDialog = new ProgressDialog(ctx);
    pDialog.setMessage("Aguarde...");
    pDialog.setIndeterminate(true);
    pDialog.setCancelable(false);
    pDialog.show();
}

@Override
protected JSONArray doInBackground(Void... params) {
    UserFunctions userFunction = new UserFunctions();
    json = userFunction.newUser(fullname, email, login, password, country, genre, birthday, promocode);

    return json;

}

protected void onPostExecute(JSONArray result) {
    // dismiss the dialog once done
    pDialog.dismiss();
    final AlertDialog alertDialog = new AlertDialog.Builder(
            RegisterActivity.this).create();

            try {
                status = json.getString(0);
                msg = json.getString(1);
                Log.d("Status", status);
            } catch (JSONException e) {
                Log.e("RegisterActiviry", "Error converting result " + e.toString());
                e.printStackTrace();
                status = null;
            }

            if (status.equalsIgnoreCase("erro")){
                alertDialog.setTitle("Erro");
                alertDialog.setMessage(msg);

            }else if (status.equalsIgnoreCase("sucesso")){
                alertDialog.setTitle("Sucesso!");
                alertDialog.setMessage(msg);
                finishActivity = true;
            }else{
                alertDialog.setTitle("Erro");   
                alertDialog.setMessage("Não foi possível realizar seu cadastro, tente novamente mais tarde.");
            }


            alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    if(finishActivity){
                    finish();
                    }else{
                        alertDialog.dismiss();
                    }
                }
        });

        alertDialog.show();

}

}

}

1 个答案:

答案 0 :(得分:2)

按照下面的对话框,我希望它可以正常工作。

runOnUiThread(new Runnable() {
                    public void run() {

                   //Your dailog 

                    }
                });
相关问题