0

別のリクエストから、同じアクティビティでデータをロードする必要があります

リクエスト 1 はデータをロードし、リクエスト 2 は別の URL からデータをロードします。

今、私はそれらをシーケンシャルと呼んでいます

request1.run () request2.run ()

それらの前にダイアログを表示し、すべてのデータが終了した後にそれらを非表示にする必要があるという問題

誰かがそれを行うための最良の方法を教えてもらえますか?

4

2 に答える 2

1

AsyncTask が機能しています:

doInBackground:実行時間の長い操作を実行するコードは、このメソッドに入ります。ボタンのクリック時に onClick メソッドが実行されると、パラメーターを受け取る execute メソッドが呼び出され、渡されたパラメーターで doInBackground メソッドが自動的に呼び出されます。

onPostExecute:このメソッドは、doInBackground メソッドが処理を完了した後に呼び出されます。doInBackground からの結果がこのメソッドに渡されます。

onPreExecute:このメソッドは、doInBackground メソッドが呼び出される前に呼び出されます。

class Login extends AsyncTask {

    private final static String TAG = "LoginActivity.Login";

    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
        Log.d(TAG, "Executando onPreExecute Login");
        //inicia diálogo de progresso, mostranto processamento com servidor.
        progressDialog = ProgressDialog.show(LoginActivity.this, "Autenticando", "Contactando o servidor, por favor, aguarde alguns instantes.", true, false);
    }


    @SuppressWarnings("unchecked")
    @Override
    protected String doInBackground(Object... parametros) {
        Log.d(TAG, "Executando doInBackground Login");
        Object[] params = parametros;
        HttpClient httpClient = (HttpClient) params[0];
        List<NameValuePair> listaParametros = (List<NameValuePair>) params[1];
        String result = null;
        try{
        result = HttpProxy.httpPost(AnototudoMetadata.URL_AUTENTICACAO, httpClient, listaParametros);
        }catch (IOException e) {
            Log.e(TAG, "IOException, Sem conectividade com o servidor do Anototudo! " + e.getMessage());
            e.printStackTrace();
            return result;
        }
        return result;
    }

    @Override
    protected void onPostExecute(String result)
    {
        super.onPostExecute(result);

        if (result == null || result.equals("")) {
            progressDialog.dismiss();
            Alerta
                    .popupAlertaComBotaoOK(
                            "Dados incorretos",
                            "Os dados informados não foram encontrados no Sistema! Informe novamente ou cadastre-se antes pela internet.",
                            LoginActivity.this);
            return;
        }

        Log.d(TAG, "Login passou persistindo info de login local no device");
        ContentValues contentValues = new ContentValues();
        contentValues.put(AnototudoMetadata.LOGIN_EMAIL, sLogin);
        contentValues.put(AnototudoMetadata.LOGIN_SENHA, sSenha);
        contentValues.put(AnototudoMetadata.LOGIN_SENHA_GERADA, result);
        LoginDB loginDB = new LoginDB();
        loginDB.addLogin(LoginActivity.this, contentValues);
        Log.d(TAG, "Persistiu info de login no device, redirecionando para menu principal do Anototudo");
        Log.d(TAG, "O retorno da chamada foi ==>> " + result);
        // tudo ok chama menu principal
        Log.d(TAG, "Device foi corretametne autenticado, chamando tela do menu principal do Anototudo.");

        String actionName = "br.com.anototudo.intent.action.MainMenuView";
        Intent intent = new Intent(actionName);
        LoginActivity.this.startActivity(intent);
        progressDialog.dismiss();
    }

} 
于 2014-09-17T23:30:42.820 に答える
0

次の行に沿って、非同期タスクを使用してみてください

private class RunRequestsTasks extends AsyncTask<Void,Void,Void>{
    private Context tContext;

    @Override
    protected void onPreExecute(){
        //Build dialog here
    }
    @Override
    protected void doInBackground(Void... voids) {
        request1.run();
        request2.run()
        return null;
    }

    @Override
    protected void onPostExecute(Void voidRet){
        //Dismiss dialog here
    }
}

ただし、より詳細な情報がなければ、よりカスタマイズされた回答を提供することは困難です。

于 2014-09-17T23:21:53.240 に答える