2016-09-21 7 views
5

こんにちは私は進捗ダイアログを表示して電話機を回転させるログイン画面を実装しようとしています。ログイン画面に進捗ダイアログが表示され、画面の向きが変更される

私はそれを行うための最善の方法(IntentService、AsyncTask、Service)と電話機の回転を許可していますか?

私は

+2

あなたが何をしたいのか説明できますか? – Singh

+0

@Singh私はprogressdialogを表示しているサーバーでログインし、ログインアクションを殺さずに電話機を回転させたい –

+0

技術的には、3つのAndroidビルディングブロックのそれぞれを使用したソリューションがあります。少なくともアクティビティのライフサイクルに結びついたIntentServiceを推奨するかもしれませんが、ブロードキャストで接続するのは、AsyncTaskを利用するよりも扱いにくいです。これらの方法の1つを試みるためには、SOの質問が本当に最善であり、コミュニティはそこから助けることができます。 – FishStix

答えて

-1

あなたはこのを試してみましたAsyncTaskと空のフラグメントを使用して異なることを言っロットの回答などを読んで?

<activity 
    android:name=".MainActivity" 
    android:configChanges="orientation|screenSize"> 
</activity> 

このようにして、アクティビティは再作成されません。

0

AndroidManifest.xmlファイル内のアクティビティ要素にこの属性を追加してみてください。android:configChanges="orientation" AsyncTaskオブジェクトのonPreExecuteメソッドにProgressDialogを表示し、onPostExecuteメソッドでProgressDialogをキャンセルします。 doInBackgroundメソッドが実行中です。方向を変更するとき。あなたが回転できるように、マニフェストでそのような何かを行うことができます

1

:進行状況ダイアログでasynctaskを行うには

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     Log.v(this.getClass().getName(), "onConfigurationChanged()"); 
    } 

<application 
     android:allowBackup="true" 
     android:configChanges="orientation|keyboardHidden|screenSize" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".activities.MainActivity" 
      android:configChanges="orientation|keyboardHidden|screenSize" 
      android:label="@string/app_name"/> 

を次に、あなたの活動内でこのsnipetで回転をキャッチすることができますこのスニペットはあなたにあなたを与えるべきです:

private ProgressDialog pDialog; 

private class MyAsync extends AsyncTask<String, Void, String> { 
    Activity context; 

    public MyAsync (Activity context) { 
     this.context = context; 
    } 

    @Override 
    protected void onPreExecute(){ 
     super.onPreExecute(); 
     pdia = new ProgressDialog(context); 
     pdia.setMessage("Loading..."); 
     pdia.show();  
    } 
    @Override 
    protected String doInBackground(String... urls) { 
     ... 
     //do your login scheme 
     ... 
     //context.methods() 
     return "ok"; 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     pDialog.dismiss(); 
     if(result!=null && result.equals("ok")){ 
      //login was successfully done 
     } else { 
      //login has failed 
     } 
    } 
} 

そしてこのasynctas

new MyAsync(this).execute(null, null , null); 

thisがあなたの活動/断片である、ところで:あなたが呼び出しshoud Kです。

0

詳しい回答はhttp://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.htmlを参照してください。

基本的には、LoginActivity内でsetRetainInstanceがtrueに設定されたフラグメントを使用して、方向変更中にアクティビティが再作成されたときに破棄されないようにすることができます。

サンプルコード:

public class AsyncFragment extends Fragment { 

    private LoginTask mTask; 
    private AsyncTaskListener mListener; 
    private static final String TAG = "AsyncFragment"; 
    private boolean isTaskRunning = false; 
    private ProgressDialog mProgressDialog; 
    FrameLayout mLayout; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
     mTask = new LoginTask(); 
     mTask.execute(); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     mLayout = new FrameLayout(getActivity()); 
     mLayout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
     if(isTaskRunning) { 
      mProgressDialog = new ProgressDialog(getActivity()); 
      mProgressDialog.show(); 
     } 
     return mLayout; 
    } 

    @Override 
    public void onDestroyView() { 
     if(mProgressDialog != null && mProgressDialog.isShowing()) { 
      mProgressDialog.dismiss(); 
      mProgressDialog = null; 
     } 
     super.onDestroyView(); 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     try { 
      mListener = (AsyncTaskListener) context; 
     } catch (ClassCastException e) { 
      Log.d(TAG, "Class not instance of AsyncTaskListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     mListener = null; 
     super.onDetach(); 
    } 

    private class LoginTask extends AsyncTask<Void,Integer,Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 
      if(mListener != null) { 
       mListener.onBackground(); 
      } 
      SystemClock.sleep(10000); 
      return null; 
     } 

     @Override 
     protected void onPreExecute() { 
      isTaskRunning = true; 
      mProgressDialog = new ProgressDialog(getActivity()); 
      mProgressDialog.show(); 
      if(mListener != null) { 
       mListener.onPreExecute(); 
      } 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      if(mListener != null) { 
       mListener.onPostExecute(); 
      } 
      isTaskRunning = false; 
      if(mProgressDialog != null && mProgressDialog.isShowing()) { 
       mProgressDialog.dismiss(); 
       mProgressDialog = null; 
      } 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
      super.onProgressUpdate(values); 
      if(mListener != null) { 
       mListener.onProgressUpdate(values[0]); 
      } 
     } 

     @Override 
     protected void onCancelled() { 
      super.onCancelled(); 
      if(mListener != null) { 
       mListener.onCancelled(); 
      } 
     } 
    } 

    //Listener to notify for async task callbacks 
    public interface AsyncTaskListener{ 
     void onPreExecute(); 
     void onPostExecute(); 
     void onCancelled(); 
     void onBackground(); 
     void onProgressUpdate(int progress); 
    } 
} 

LoginActivity

public class MainActivity extends AppCompatActivity implements AsyncFragment.AsyncTaskListener{ 

    private static final String FRAGMENT_TAG = "asyncFragment"; 
    private static final String TAG = "MainActivity"; 

    private AsyncFragment mAsyncFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FragmentManager fm = getSupportFragmentManager(); 
     mAsyncFragment = (AsyncFragment) fm.findFragmentByTag(FRAGMENT_TAG); 
     if (mAsyncFragment == null) { //fragment was retained during orientation change 
      mAsyncFragment = new AsyncFragment(); 
      fm.beginTransaction().add(mAsyncFragment, FRAGMENT_TAG).commit(); 
     } 

    } 

    @Override 
    public void onPreExecute() { 
     Log.d(TAG, "onPreExecute: "); 
    } 

    @Override 
    public void onPostExecute() { 
     Log.d(TAG, "onPostExecute: "); 
    } 

    @Override 
    public void onCancelled() { 
     Log.d(TAG, "onCancelled: ");  
    } 

    @Override 
    public void onBackground() { 
     Log.d(TAG, "onBackground: "); 
    } 

    @Override 
    public void onProgressUpdate(int progress) { 
     Log.d(TAG, "onProgressUpdate: "); 
    } 
関連する問題