Android: как дождаться завершения метода, прежде чем продолжить - PullRequest
0 голосов
/ 27 июня 2019

У меня есть метод с именем getData(), который загружается в начале действия всплеска; он в основном подключается к json и извлекает из него некоторые строки.

У меня две проблемы:

Моя первая проблема здесь ... Этот метод занимает несколько секунд для подключения и извлечения данных из json, но моя программа, похоже, не ждет и продолжает воспроизводить следующие строки кода и одновременно запускать getData(), что неправильно . Сначала мне нужно получить несколько строк, а затем воспроизвести следующий код.

Моя вторая проблема заключается в том, что я хочу дважды позвонить на getData(), если приложение не может подключиться к json. это можно проверить с логическим значением isupdated, которое имеет истинное значение внутри getData(), если оно было успешно подключено. Но опять же, невозможно вызвать метод getData() и дождаться его завершения. Ни один из этих способов не может помочь:

for(int x =0 , x<3 , x++ )
{
    if(!jsonfetch.isupdated) {jsonfetch.getData(splash.this)}
}

или

while (!jsonfetch.isupdated){
        jsonfetch.getData(splash.this);
    }

Условие всегда ложно, и он вызывает метод одновременно, потому что он не ждет его завершения, прежде чем проверять условие снова ...

Я пробовал очень много решений, таких как Помещение getData() в поток и вызов join(), но оно не ждет. Я также пытался AsyncTask, но он вызывает onPostExecute() до завершения метода, который я не понимаю.

Ниже приведен код getData ()

    public static void getData(final Context context) {
    handleSSLHandshake();
    requestQueue = Volley.newRequestQueue(context.getApplicationContext());
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, encryption.URL_main(), null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                Log.i("update_statut","Start Fetch .");
                popup_msg = jsonfect_Decryption(response.getString(encryption.epopup_msg));
                banner = jsonfect_Decryption(response.getString(encryption.ebanner));
                banner2= jsonfect_Decryption(response.getString(encryption.ebanner2));
                interstitial = jsonfect_Decryption(response.getString(encryption.einterstitial));
                interstitial_Inside = jsonfect_Decryption(response.getString(encryption.einterstitial_Inside));
                youtube_url = jsonfect_Decryption(response.getString(encryption.eyoutube_url));
                dialog_check = Boolean.parseBoolean(jsonfect_Decryption(response.getString(encryption.dialog_check)));
                dialog_Image_URL =jsonfect_Decryption(response.getString(encryption.dialog_Image_URL));
                dialog_URL = jsonfect_Decryption(response.getString(encryption.dialog_URL));
                dialog_txt= jsonfect_Decryption(response.getString(encryption.dialog_msg));
                dialog_canceble= Boolean.parseBoolean(jsonfect_Decryption(response.getString(encryption.dialog_canceble)));
                m3u_app_url = jsonfect_Decryption(response.getString(encryption.edownload_appurl));
                premium_url = jsonfect_Decryption(response.getString(encryption.emuimerp));
                premium_msg = jsonfect_Decryption(response.getString(encryption.epremium_msg));
                online_version=response.getString("ON_version");
                updated_version=response.getString("UP_version");
                url_version = jsonfect_Decryption(response.getString(encryption.eurl_version));
                activation = response.getString("act");

                isupdated=true;

                Log.i("update_statut","Ending Fetch .");

            } catch (JSONException e) {
                e.printStackTrace();
                Log.i("json",""+e.getMessage());
                isupdated=false;
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.i("json",""+error.getMessage());
            isupdated=false;
        }
    }) {

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> params = new HashMap<String, String>();
            params.put("Content-Type", "application/json");
            String creds = String.format("%s:%s",encryption.USERNAME(),encryption.Password());
            String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT);
            params.put("Authorization", auth);
            return params;

        }
    };
    requestQueue.add(jsonObjectRequest);
}

Сильфон - Всплеск Активность

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Fabric.with(this, new Crashlytics());
    setContentView(R.layout._splash_java);


    /// Start Animation
    circle=(ImageView)findViewById(R.id.img_circle);
    textView2=(TextView) findViewById(R.id.textView2);
    txtwelcome=(TextView) findViewById(R.id.txtwelcome);
    relativeLayout=(RelativeLayout)findViewById(R.id.relativelayout);
    startAnimation();

    // GET DATABASE DATA
    while (!jsonfetch.isupdated){
        jsonfetch.getData(splash.this);
    }

    // Check Version

                    onlineVersion = jsonfetch.online_version;
                    updatedVersion = jsonfetch.updated_version;
                    try {
                        currentVersion = splash.this.getPackageManager()
                                .getPackageInfo(splash.this.getPackageName(), 0).versionName;
                    } catch (PackageManager.NameNotFoundException e) {
                        Log.d("update_statut", "currentVersion value is " + e.getMessage());
                    }

                    if ( onlineVersion == null || updatedVersion == null || onlineVersion.equals("null") || updatedVersion.equals("null")  ) {
                        Log.d("update_statut", "online_Version or updated_Version issue");
                        Log.d("update_statut", "Current version " + currentVersion + " & Online version " + onlineVersion + " & Updated version " + updatedVersion);
                        check_version = true;
                        jsonfetch.isupdated = false;
                    } else if ((currentVersion.equals(onlineVersion))) {
                        Log.d("update_statut", "match");
                        Log.d("update_statut", "Current version " + currentVersion + " & Online version " + onlineVersion);
                        check_version = true;
                        Interstitial_LOAD();
                    } else if ((currentVersion.equals(updatedVersion))) {
                        Log.d("update_statut", "match");
                        Log.d("update_statut", "Current version " + currentVersion + " & Updated version " + updatedVersion);
                        check_version = true;
                        Interstitial_LOAD();
                    } else {
                        Log.d("update_statut", "doesn't match");
                        Log.d("update_statut", "Current version " + currentVersion + " & Online version " + onlineVersion);
                        check_version = false;
                    }



    /// Load Next Activity after 5s so that Interstitial can be loaded


            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
            @Override
            public void run() {
            if(  (!check_version) && jsonfetch.isupdated){
                update_dialog();
                Log.d("update_statut", "Update dialog ");
            } else {
                Interstitial_SHOW();
            }
        }
    }, 5000);

}



private void Interstitial_LOAD()  {
    String inter_code = jsonfetch.interstitial;
    if ( inter_code!=null && !(inter_code.equals("null") || inter_code.equals("") )  ){
        AdRequest adRequestI = new AdRequest.Builder().build();
        interstitial = new InterstitialAd(this);
        interstitial.setAdUnitId(inter_code);
        interstitial.loadAd(adRequestI);
    }
}




    private void Interstitial_SHOW() {

    String inter_code = jsonfetch.interstitial;
    if ( inter_code!=null && !(inter_code.equals("null") || inter_code.equals("") )  )
    {
        if (interstitial.isLoaded())
        {
            interstitial.show();
            interstitial.setAdListener(new AdListener(){
                @Override
                public void onAdClosed() {
                    startActivity(new Intent(splash.this, first_java.class).setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
                    splash.this.finish();
                }
            });
        }
        else
        {
            startActivity(new Intent(splash.this, first_java.class).setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
            splash.this.finish();
        }
    }

    else {
        startActivity(new Intent(splash.this, first_java.class).setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
        splash.this.finish();
    }

}

1 Ответ

0 голосов
/ 27 июня 2019

В ОТНОШЕНИИ ВАШЕГО ПЕРВОГО КОНЦЕРНА ...

Если вы хотите сделать паузу, используйте java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep (1);

Для сна на одну секунду или более

TimeUnit.MINUTES.sleep (1);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...