2

当应用程序对在线数据库进行查询时,我试图向用户显示加载图标。我尝试过使用 AnimationDrawable(我放弃了,因为不需要自定义图标)、ProgressDialog 和 ProgressBar。ProgressBar 似乎最合适,因为我不想要消息,只是一个旋转图标。但我什至不能让 ProgressBar 出现在屏幕上,不管我在哪里调用它。我的 ProgressDialog 出现在屏幕上,但它只出现在服务器响应之后,如果我使用 dismiss() 或 cancel() 它甚至根本不会出现。

我使用 AsyncTasks 或 Threads 取得了任何成功。

在应用程序中,有一个类 JogarActivity.java 尝试显示选项列表。它接收一些参数,如用户 id,并调用 UserFunctions:

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

下面是 userFunctions 中的 getJogar 函数: public JSONArray getJogar(String categoria, String usuarioId){ List params = new ArrayList();

    params.add(new BasicNameValuePair("categoria", categoria));
    params.add(new BasicNameValuePair("idUsuario", usuarioId));
    JSONArray json = jsonParser.getJSONFromUrl(perguntaURL, params);

    return json;
}

JSONParser.java 是发出 httpRequest 的类: public JSONArray getJSONFromUrl(String url, List params) {

    // Making HTTP request
    try {
        // defaultHttpClient
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(new UrlEncodedFormEntity(params));



        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();



        // json = EntityUtils.toString(httpEntity);
        // HttpEntity httpEntity2 = httpEntity;
        json = EntityUtils.toString(httpEntity);
        // is = httpEntity.getContent();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } 
            //then makes the JSON manipulation

只要 JSONParser 和 userFunctions 不是活动,我就不能在其中使用 ProgressDialogs(无法获取应用程序上下文)。所有服务器请求都在 JSONParser.java 中进行,这就是我首先尝试将 ProgressDialog/ProgressBar 放在那里的原因。

我所达到的最接近的是在 JogarActivity 中使用此代码(它显示 ProgressDialog,但在获得服务器的响应之后。如果我使用关闭,它甚至不会出现)

   final ProgressDialog loader = new ProgressDialog(JogarActivity.this);
    loader.show();
    //...the if-else code i've pasted above
    loader.dismiss();

即使使用 runOnUiThread 它也不起作用!我越来越没有选择...

感谢所有帮助。

4

1 回答 1

1

这有效:

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

}

}


}
于 2012-05-23T11:34:53.273 回答