サーバーの応答を待っている間に 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- 質問に関する情報を含むダイアログと、押されたときにアクティビティを再開する [OK] ボタンを表示します。次の質問は、intent.putExtra() として渡され、primiraPergunta (最初の質問?) は false に設定されます。
*UserFunctions と JSONParser はアクティビティではないため、アプリケーションのコンテキストを取得できない限り、それらの中で ProgressDialog を使用することはできません。*JSONParser は他のクラスで使用されているため、変更しないことを好みます *JogarActivity のすべてを書き換える以外の解決策を探しています (他のクラスも変更する必要があります)。
まず、JogarActivity を変更せずに貼り付けました。次に、AsyncTask を追加して ProgressDialog を表示しようとしましたが、画面に表示されません (AsyncTask.get() を使用して、JogarActivity が asynctask からの結果を待機するようにします)。最後に、AsyncTask が正常に機能する別のクラス (RegisterActivity) を貼り付けました。
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();
}
}
}