我想在等待服务器响应时显示 ProgressDialog。
我的班级 JogarActivity 执行以下操作(我的应用程序是一个问答游戏):
1-初始化变量
2-验证它是否是第一个问题(primeiraPergunta)
2.1- 如果是第一个问题,调用 UserFunctions.getJogar()。此函数构建一个带有参数的列表并将其发送到 JSONParser 类。JSONParser 发出 http 请求并返回一个带有数据的 JSONArray
2.2-如果不是第一个问题,只需从意图附加内容中检索实际问题。
3-尝试将 JSONArray 解析为字符串。如果用户已经回答了实际类别中的所有问题,这将返回一个异常(JSONArray 将为空),因此它可以显示一个对话框,要求用户选择另一个类别。
4-将所有数据(问题和答案选项)放在屏幕上并等待用户交互。
5- 当用户选择一个答案时,它会调用 UserFunctions.gerResposta()。这一次,它将在更新数据库(标点符号、已回答的问题等)后返回状态消息(正确、错误、错误等)。它还将检索下一个问题。
6- 显示一个对话框,其中包含有关问题的信息和一个确定按钮,按下该按钮会重新启动活动。下一个问题作为 intent.putExtra() 传递,并且 primeiraPergunta(第一个问题?)设置为 false。
*UserFunctions 和 JSONParser 不是活动,所以我不能在其中使用 ProgressDialog,只要我不能检索应用程序的上下文。*JSONParser 被其他类使用,所以我不想更改它 *我正在寻找另一种解决方案,而不是重写 JogarActivity 中的所有内容(这也将需要更改其他类)。
首先在下面我粘贴了 JogarActivity 没有更改。然后,我尝试添加一个 AsyncTask 来显示 ProgressDialog,但它只是没有出现在屏幕上(AsyncTask.get() 用于让 JogarActivity 等待来自 asynctask 的结果)。最后,我粘贴了另一个类(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();
}
}
}