0

我想在等待服務器響應時顯示ProgressDialog。無法使用AsyncTask顯示ProgressDialog

我類JogarActivity執行以下操作(我的應用程序是一個問答遊戲):

1-初始化變量

2-驗證,如果它是與否的第一個問題(primeiraPergunta)

2.1 - 如果這是第一個問題,請調用UserFunctions.getJogar()。該函數使用參數構建一個列表並將其發送給JSONParser類。 JSONParser發出http請求並返回一個包含數據的JSONArray

2.2-如果它不是第一個問題,只需從intent extras中檢索實際問題。

3-嘗試將JSONArray解析爲字符串。如果用戶已經回答了實際類別中的所有問題,這將返回一個異常(JSONArray將爲空),因此它可以顯示一個對話框,要求用戶選擇另一個類別。

4-在屏幕上放置所有數據(問題和答案選項)並等待用戶的交互。

5-當用戶選擇一個答案時,它調用UserFunctions.gerResposta()。這次,它會在更新數據庫(標點符號,回答問題等)後返回一個狀態消息(正確,錯誤,錯誤等)。它也將檢索下一個問題。

6-顯示一個對話框,其中包含關於該問題的信息和一個OK按鈕,按下該按鈕後,將重新開始該活動。下一個問題以intent.putExtra()和primeiraPergunta(第一個問題?)的形式傳遞爲false。

* UserFunctions和JSONParser不是活動,所以我不能在它們內部使用ProgressDialog,只要我無法檢索應用程序的上下文。 * JSONParser被其他類使用,所以我不想更改它。 *我正在尋找另一個解決方案,而不是在JogarActivity中重寫everithing(這也將有必要更改其他類)。

首先下面我粘貼JogarActivity沒有變化。然後,我嘗試添加一個AsyncTask來顯示ProgressDialog,但它並沒有出現在屏幕上(AsyncTask.get()用於使JogarActivity等待來自asynctask的結果)。 Finnaly,我粘貼了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; 
} 

}

============== JogarActivity用的AsyncTask (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(Works fine)= =====================

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

} 

}

}

回答

2

把你的對話框如下,我希望它會工作。

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

        //Your dailog 

        } 
       }); 
+0

我在調用UserFunction之前使用過它,但對話框仍然沒有出現。編輯:如果我不使用pDialog.dismiss(),它會出現(但不會在服務器響應後消失)。 –

+0

pDialog.dismiss()不會在後執行中調用,第一次分析您需要關閉對話框的位置。把「pDialog.dismiss()」放在上面的線程中......請在關閉它之前檢查它是否打開或者你是否有布爾方法來知道對話框是否打開。 –