SORU
7 Aralık 2011, ÇARŞAMBA


Android Parçaları. Ekran döndürme sırasında bir AsyncTask istinat veya yapılandırma değişikliği

Akıllı telefon / Tablet uygulaması, ekran boyutuna bağlı olarak gerekli olduğu gibi, en iyi tasarım seçimi ACL) kullanarak Parçaları gibiydi sadece bir MUAYENE ve yükleme kaynaklarını kullanarak üzerinde çalışıyorum.

Bu uygulama artık sadece faaliyet tabanlı olmak kadar iyi çalışıyor. Bu ekran döndürme bile onları iş sahibi olmak için Faaliyetlerine AsyncTasks ve ProgressDialogs idare ettim nasıl sahte bir sınıf ya da bir yapılandırma değişikliği orta iletişim oluşur.

İstemiyorum değiştirmek için bildirim önlemek Rekreasyon Faaliyeti, pek çok sebep neden ben yapmak istiyorum, ama esas olarak, çünkü resmi dokümanlar demek değildir önerilen ve başardım olmadan bu kadar ileri, bu yüzden lütfen " bu yolu.

public class Login extends Activity {

    static ProgressDialog pd;
    AsyncTask<String, Void, Boolean> asyncLoginThread;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.login);
        //SETUP UI OBJECTS
        restoreAsyncTask();
    }

    @Override
    public Object onRetainNonConfigurationInstance() {
        if (pd != null) pd.dismiss();
        if (asyncLoginThread != null) return (asyncLoginThread);
        return super.onRetainNonConfigurationInstance();
    }

    private void restoreAsyncTask();() {
        pd = new ProgressDialog(Login.this);
        if (getLastNonConfigurationInstance() != null) {
            asyncLoginThread = (AsyncTask<String, Void, Boolean>) getLastNonConfigurationInstance();
            if (asyncLoginThread != null) {
                if (!(asyncLoginThread.getStatus()
                        .equals(AsyncTask.Status.FINISHED))) {
                    showProgressDialog();
                }
            }
        }
    }

    public class LoginThread extends AsyncTask<String, Void, Boolean> {
        @Override
        protected Boolean doInBackground(String... args) {
            try {
                //Connect to WS, recieve a JSON/XML Response
                //Place it somewhere I can use it.
            } catch (Exception e) {
                return true;
            }
            return true;
        }

        protected void onPostExecute(Boolean result) {
            if (result) {
                pd.dismiss();
                //Handle the response. Either deny entry or launch new Login Succesful Activity
            }
        }
    }
}

Bu kod gayet iyi çalışıyor, hiç şikayet etmeden 10.000 kullanıcı var, yeni Fragman Tasarımı Temel olarak bu mantık kopyalamak için mantıklı görünüyordu, ama, tabii ki, çalışıyor değil mi yani.

İşte LoginFragment:

public class LoginFragment extends Fragment {

    FragmentActivity parentActivity;
    static ProgressDialog pd;
    AsyncTask<String, Void, Boolean> asyncLoginThread;

    public interface OnLoginSuccessfulListener {
        public void onLoginSuccessful(GlobalContainer globalContainer);
    }

    public void onSaveInstanceState(Bundle outState){
        super.onSaveInstanceState(outState);
        //Save some stuff for the UI State
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setRetainInstance(true);
        //If I setRetainInstance(true), savedInstanceState is always null. Besides that, when loading UI State, a NPE is thrown when looking for UI Objects.
        parentActivity = getActivity();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            loginSuccessfulListener = (OnLoginSuccessfulListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()   " must implement OnLoginSuccessfulListener");
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        RelativeLayout loginLayout = (RelativeLayout) inflater.inflate(R.layout.login, container, false);
        return loginLayout;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //SETUP UI OBJECTS
        if(savedInstanceState != null){
            //Reload UI state. Im doing this properly, keeping the content of the UI objects, not the object it self to avoid memory leaks.
        }
    }

    public class LoginThread extends AsyncTask<String, Void, Boolean> {
            @Override
            protected Boolean doInBackground(String... args) {
                try {
                    //Connect to WS, recieve a JSON/XML Response
                    //Place it somewhere I can use it.
                } catch (Exception e) {
                    return true;
                }
                return true;
            }

            protected void onPostExecute(Boolean result) {
                if (result) {
                    pd.dismiss();
                    //Handle the response. Either deny entry or launch new Login Succesful Activity
                }
            }
        }
    }
}

I cant Etkinliği ve getLastNonConfigurationInstance() Parçası, aynı şey geçerli değil denmesinden yana onRetainNonConfigurationInstance() kullanın. Bazı benzer sorulara burada cevap ile okudum.

Söyleniyor, aynı temel tasarım mantığı korumak gibi bunlar düzgün parçalar halinde organize olmaya çalışıyor gerekebilir anlıyorum.

Ne olurdu doğru yolu tut AsyncTask sırasında bir yapılandırma değişikliği, ve eğer hala runing, Haritayı bir progressDialog, göz önüne alarak bu AsyncTask bir iç sınıf için Parça ve bu Parçanın kendisi kim çağırır AsyncTask.() yürütmek?

CEVAP
18 Aralık 2011, Pazar


Parçaları aslında bu çok daha kolay olabilir. Sadece kullanım yöntemi Fragment.setRetainInstance(boolean) parça örnek yapılandırma değişiklikleri karşısında korumuştur. Bu dokümanlar Activity.onRetainnonConfigurationInstance() için önerilen değişiklik olduğunu unutmayın.

Eğer bazı nedenlerden dolayı gerçekten tutulan bir parça kullanmak istemiyorsanız, yapabileceğiniz başka bir yaklaşım vardır. Her parça benzersiz bir tanımlayıcı Fragment.getId() tarafından döndürülen olduğunu unutmayın. Ayrıca eğer bir parça Fragment.getActivity().isChangingConfigurations() config değişiklik yıkılıyor olmadığını öğrenebilirsiniz. Yani, bir noktada olurdu karar durdurmak için AsyncTask (onStop (), onDestroy() büyük olasılıkla), olabilir örneğin kontrol ederseniz yapılandırma değişiyor ve eğer sopa öyle bir statik SparseArray altında parçanın tanımlayıcı ve sonra senin onCreate (), onStart() bak bakalım bir AsyncTask içinde seyrek dizi kullanılabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Darren Kitchen

    Darren Kitch

    3 EKİM 2011
  • newport83

    newport83

    19 HAZİRAN 2006
  • The Warp Zone

    The Warp Zon

    24 AĞUSTOS 2007