Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 登录屏幕显示progressdialog并允许更改屏幕方向_Android_Android Asynctask_Android Intentservice - Fatal编程技术网

Android 登录屏幕显示progressdialog并允许更改屏幕方向

Android 登录屏幕显示progressdialog并允许更改屏幕方向,android,android-asynctask,android-intentservice,Android,Android Asynctask,Android Intentservice,你好,我正在尝试实现一个登录屏幕,显示一个进度对话框,并允许手机旋转 我想问一下什么是最好的方法(IntentService、AsyncTask、Service)并允许手机旋转 我读了很多答案,用AsyncTask等空片段说了不同的事情。你试过这个吗 <activity android:name=".MainActivity" android:configChanges="orientation|screenSize"> </activity> 这样

你好,我正在尝试实现一个登录屏幕,显示一个进度对话框,并允许手机旋转

我想问一下什么是最好的方法(IntentService、AsyncTask、Service)并允许手机旋转

我读了很多答案,用AsyncTask等空片段说了不同的事情。

你试过这个吗

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


这样就不会重新创建活动。但是您可以使用
onConfigurationChanged()

检测屏幕方向,尝试将此属性
android:configChanges=“orientation”
添加到
AndroidManifest.xml
文件中的活动元素中。
在AsyncTask对象的onPreExecute方法中显示ProgressDialog,并在onPostExecute方法中取消ProgressDialog。更改方向时,doInBackground方法正在运行。

您可以在清单中执行类似操作以允许旋转:

<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
        }
    }
}
顺便说一下,
这是您的活动/片段。

有关详细答案,请参阅

基本上,您可以在LoginActivity中使用将setRetainInstance设置为true的fragment,这样在方向更改期间重新创建活动时,它就不会被破坏

示例代码:

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

你能解释一下你想做什么吗?@Singh我想用显示progressdialog的服务器登录,并允许手机在不终止登录操作的情况下旋转。技术上,有一个解决方案使用三个Android构建块中的每一个。我可以建议IntentService与活动的生命周期联系最少。。。但是,通过广播将其连接起来比使用异步任务更为棘手。一个SO问题最好尝试这些方法中的一种,社区可以从中提供帮助。
new MyAsync(this).execute(null, null , null);
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);
    }
}
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: ");
    }