/**
* 使用onSaveInstanceState,onRestoreInstanceState;
* 在这里不考虑没有加载完毕,就旋转屏幕的情况。
* @author 超超boy
*
*/
public class SavedInstanceStateActivity extends ListActivity
{
private static final String TAG = "MainActivity";
private ListAdapter mAdapter;
private ArrayList<String> mDatas;
private DialogFragment mLoadingDialog;
private LoadDataAsyncTask mLoadDataAsyncTask;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.e(TAG, "onCreate");
initData(savedInstanceState);
}
/**
* 初始化数据
*/
private void initData(Bundle savedInstanceState)
{
if (savedInstanceState != null)
mDatas = savedInstanceState.getStringArrayList("mDatas");
if (mDatas == null)
{
mLoadingDialog = new LoadingDialog();
mLoadingDialog.show(getFragmentManager(), "LoadingDialog");
mLoadDataAsyncTask = new LoadDataAsyncTask();
mLoadDataAsyncTask.execute();
//mLoadDataAsyncTas
} else
{
initAdapter();
}
}
/**
* 初始化适配器
*/
private void initAdapter()
{
mAdapter = new ArrayAdapter<String>(
SavedInstanceStateActivity.this,
android.R.layout.simple_list_item_1, mDatas);
setListAdapter(mAdapter);
}
@Override
protected void onRestoreInstanceState(Bundle state)
{
super.onRestoreInstanceState(state);
Log.e(TAG, "onRestoreInstanceState");
}
@Override
//在这里保存数据,好用于返回
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
Log.e(TAG, "onSaveInstanceState");
outState.putSerializable("mDatas", mDatas);
}
/**
* 模拟耗时操作
*
* @return
*/
private ArrayList<String> generateTimeConsumingDatas()
{
try
{
Thread.sleep(3000);
} catch (InterruptedException e)
{ e.printStackTrace();
}
return new ArrayList<String>(Arrays.asList("通过Fragment保存大量数据",
"onSaveInstanceState保存数据",
"getLastNonConfigurationInstance已经被弃用", "RabbitMQ", "Hadoop",
"Spark"));
}
private class LoadDataAsyncTask extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... params)
{
mDatas = generateTimeConsumingDatas();
return null;
}
@Override
protected void onPostExecute(Void result)
{
mLoadingDialog.dismiss();
initAdapter();
}
}
@Override
protected void onDestroy()
{
Log.e(TAG, "onDestroy");
super.onDestroy();
}
}
public class RetainedFragment extends Fragment {
// data object we want to retain
private MyDataObject data;
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}
public void setData(MyDataObject data) {
this.data = data;
}
public MyDataObject getData() {
return data;
}
}
public class RetainedFragment extends Fragment
{
// data object we want to retain
private Bitmap data;
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}
public void setData(Bitmap data)
{
this.data = data;
}
public Bitmap getData()
{
return data;
}
}
public class FragmentRetainDataActivity extends Activity
{
private static final String TAG = "FragmentRetainData";
private RetainedFragment dataFragment;
private DialogFragment mLoadingDialog;
private ImageView mImageView;
private Bitmap mBitmap;
BitmapWorkerTask bitmapWorkerTask;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "onCreate");
// find the retained fragment on activity restarts
FragmentManager fm = getFragmentManager();
dataFragment = (RetainedFragment) fm.findFragmentByTag("data");
// create the fragment and data the first time
if (dataFragment == null)
{
// add the fragment
dataFragment = new RetainedFragment();
fm.beginTransaction().add(dataFragment, "data").commit();
}
// the data is available in dataFragment.getData()
mBitmap = dataFragment.getData();
initView();
}
/**
* 初始化控件
*/
private void initView()
{
mImageView = (ImageView) findViewById(R.id.id_imageView);
if(mBitmap != null)
mImageView.setImageBitmap(mBitmap);
//图片为空时,加载图片;有时候即使dataFragment!=null时,图片也不一定就加载完了,比如在加载的过程中,旋转屏幕,此时图片就没有加载完
else{
mLoadingDialog = new LoadingDialog();
mLoadingDialog.show(getFragmentManager(), "LOADING_DIALOG");
bitmapWorkerTask = new BitmapWorkerTask(this);
bitmapWorkerTask.execute("http://images2015.cnblogs.com/blog/747969/201612/747969-20161222164357995-1098775233.jpg");
}
}
/**
* 异步下载图片的任务。
* 设置成静态内部类是为了防止内存泄漏
* @author guolin
*/
private static class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> {
//图片的URL地址
private String imageUrl;
//保存外部activity的弱引用
private WeakReference<Context> weakReference;
public BitmapWorkerTask(Context context) {
weakReference = new WeakReference<>(context);
}
@Override
protected Bitmap doInBackground(String... params) {
imageUrl = params[0];
//为了演示加载过程,阻塞2秒
try
{Thread.sleep(2000);
} catch (InterruptedException e)
{ e.printStackTrace();
}
return downloadUrlToStream(imageUrl);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if(bitmap !=null){
FragmentRetainDataActivity retainDataActivity= (FragmentRetainDataActivity) weakReference.get();
//调用回调方法
retainDataActivity.onLoaded(bitmap);
}
}
/**
* 建立HTTP请求,并获取Bitmap对象。
* 修改了下
* @param urlString
* 图片的URL地址
* @return 解析后的Bitmap对象
*/
private Bitmap downloadUrlToStream(String urlString) {
HttpURLConnection urlConnection = null;
Bitmap bitmap = null;
try {
final URL url = new URL(urlString);
urlConnection = (HttpURLConnection) url.openConnection();
if(urlConnection.getResponseCode()==HttpURLConnection.HTTP_OK){ //连接成功
InputStream is = urlConnection.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();
return bitmap;
}else{
return null;
}
} catch (final IOException e) {
e.printStackTrace();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
return null;
}
}
//加载完毕的回掉
public void onLoaded(Bitmap bitmap){
mBitmap = bitmap;
mLoadingDialog.dismiss();
mImageView.setImageBitmap(mBitmap);
// load the data from the web
dataFragment.setData(mBitmap);
Log.e(TAG, "onLoaded");
}
public void onPause(){
super.onPause();
Log.e(TAG, "onPause");
if(getFragmentManager() != null && mLoadingDialog != null)
mLoadingDialog.dismiss();
}
@Override
public void onDestroy()
{
super.onDestroy();
Log.e(TAG, "onDestroy");
if(bitmapWorkerTask !=null)
bitmapWorkerTask.cancel(true);
// store the data in the fragment
dataFragment.setData(mBitmap);
}
}
<activity android:name=".MyActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/app_name">
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
public class ConfigChangesTestActivity extends ListActivity
{
private static final String TAG = "MainActivity";
private ListAdapter mAdapter;
private ArrayList<String> mDatas;
private DialogFragment mLoadingDialog;
private LoadDataAsyncTask mLoadDataAsyncTask;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.e(TAG, "onCreate");
initData(savedInstanceState);
}
/**
* 初始化数据
*/
private void initData(Bundle savedInstanceState)
{
mLoadingDialog = new LoadingDialog();
mLoadingDialog.show(getFragmentManager(), "LoadingDialog");
mLoadDataAsyncTask = new LoadDataAsyncTask();
mLoadDataAsyncTask.execute();
}
/**
* 初始化适配器
*/
private void initAdapter()
{
mAdapter = new ArrayAdapter<String>(ConfigChangesTestActivity.this,
android.R.layout.simple_list_item_1, mDatas);
setListAdapter(mAdapter);
}
/**
* 模拟耗时操作
*
* @return
*/
private ArrayList<String> generateTimeConsumingDatas()
{
try
{
Thread.sleep(2000);
} catch (InterruptedException e)
{
}
return new ArrayList<String>(Arrays.asList("通过Fragment保存大量数据",
"onSaveInstanceState保存数据",
"getLastNonConfigurationInstance已经被弃用", "RabbitMQ", "Hadoop",
"Spark"));
}
/**
* 当配置发生变化时,不会重新启动Activity。但是会回调此方法,用户自行进行对屏幕旋转后进行处理
*/
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
{
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
{
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
private class LoadDataAsyncTask extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... params)
{
mDatas = generateTimeConsumingDatas();
return null;
}
@Override
protected void onPostExecute(Void result)
{
mLoadingDialog.dismiss();
initAdapter();
}
}
@Override
protected void onDestroy()
{
Log.e(TAG, "onDestroy");
super.onDestroy();
}
}
/**
* 保存对象的Fragment
* @author 超超boy
*
*/
public class OtherRetainedFragment extends Fragment
{
// data object we want to retain
// 保存一个异步的任务
private MyAsyncTask data;
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}
public void setData(MyAsyncTask data)
{
this.data = data;
}
public MyAsyncTask getData()
{
return data;
}
public class MyAsyncTask extends AsyncTask<Void, Void, Void>
{
//保存外部activity的弱引用
private WeakReference<Context> weakReference;
public MyAsyncTask(Context context) {
weakReference = new WeakReference<>(context);
}
private FixProblemsActivity activity;
/**
* 是否完成
*/
private boolean isCompleted;
/**
* 进度框
*/
private LoadingDialog mLoadingDialog;
private List<String> items;
/**
* 开始时,显示加载框
*/
@Override
protected void onPreExecute()
{
mLoadingDialog = new LoadingDialog();
activity = (FixProblemsActivity) weakReference.get();
if(activity != null)
mLoadingDialog.show(activity.getFragmentManager(), "LOADING");
}
/**
* 加载数据
*/
@Override
protected Void doInBackground(Void... params)
{
items = loadingData();
return null;
}
/**
* 加载完成回调当前的Activity
*/
@Override
protected void onPostExecute(Void unused)
{
isCompleted = true;
notifyActivityTaskCompleted();
if (mLoadingDialog != null)
mLoadingDialog.dismiss();
}
public List<String> getItems()
{
return items;
}
private List<String> loadingData()
{
try
{
Thread.sleep(5000);
} catch (InterruptedException e)
{
}
return new ArrayList<String>(Arrays.asList("通过Fragment保存大量数据",
"onSaveInstanceState保存数据",
"getLastNonConfigurationInstance已经被弃用", "RabbitMQ", "Hadoop",
"Spark"));
}
/**
* 设置Activity,因为Activity会一直变化
*
* @param activity
*/
public void setActivity(Context activity)
{ weakReference = new WeakReference<>(activity);
// 设置为当前的Activity
this.activity = (FixProblemsActivity) activity;
// 开启一个与当前Activity绑定的等待框
if (activity != null && !isCompleted)
{
mLoadingDialog = new LoadingDialog();
mLoadingDialog.show(this.activity.getFragmentManager(), "LOADING");
}
// 如果完成,通知Activity
if (isCompleted)
{
notifyActivityTaskCompleted();
}
}
/**
* 在Activity不可见时,关闭dialog
*/
public void dialogDismiss(){
if(mLoadingDialog != null){
mLoadingDialog.dismiss();
}
}
private void notifyActivityTaskCompleted()
{
if (null != activity)
{
activity.onTaskCompleted();
}
}
}
public class FixProblemsActivity extends ListActivity
{
private static final String TAG = "MainActivity";
private ListAdapter mAdapter;
private List<String> mDatas;
private OtherRetainedFragment dataFragment;
private MyAsyncTask mMyTask;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.e(TAG, "onCreate");
// find the retained fragment on activity restarts
FragmentManager fm = getFragmentManager();
dataFragment = (OtherRetainedFragment) fm.findFragmentByTag("data");
// create the fragment and data the first time
if (dataFragment == null)
{
// add the fragment
dataFragment = new OtherRetainedFragment();
fm.beginTransaction().add(dataFragment, "data").commit();
}
mMyTask = dataFragment.getData();
if (mMyTask != null)
{ //与新的Activity进行绑定
mMyTask.setActivity(this);
} else { //启动一个新的
mMyTask = new MyAsyncTask(this);
dataFragment.setData(mMyTask);
mMyTask.execute();
}
// the data is available in dataFragment.getData()
}
@Override
protected void onRestoreInstanceState(Bundle state)
{
super.onRestoreInstanceState(state);
Log.e(TAG, "onRestoreInstanceState");
}
@Override
protected void onDestroy()
{
Log.e(TAG, "onDestroy");
super.onDestroy();
}
@Override
//在这里关闭Dialog,否则容易造成内存泄漏
protected void onPause() {
super.onPause();
mMyTask.dialogDismiss();
}
/**
* 回调方法,更新UI
* 这里如果在加载的过程中按下返回键返回主Activity时,会出现异常,setAdapter on a null object reference。因为activity被销毁,
* 要解决这个问题,可以监听返回键事件做相应处理。
*/
public void onTaskCompleted()
{
mDatas = mMyTask.getItems();
mAdapter = new ArrayAdapter<String>(FixProblemsActivity.this,
android.R.layout.simple_list_item_1, mDatas);
setListAdapter(mAdapter);
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有