Skip to main content

Making asynctasks rotation proof

package com.mango.rotationproof;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
* Created by Avinash on 21-05-2015.
*/
public class TaskFrag extends Fragment {
MyTask myTask;
Activity activity;
public TaskFrag()
{

}
public void begintask()
{
myTask=new MyTask(activity);
myTask.execute();

}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.activity=activity;
if(myTask!=null)
{
myTask.onAttach(activity);
}
}

@Override
public void onDetach() {
super.onDetach();
if(myTask!=null) {
myTask.onDetach();
}
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return null;
}
}
 
package com.mango.rotationproof;

import android.app.Activity;
import android.os.AsyncTask;

/**
* Created by Avinash on 21-05-2015.
*/
public class MyTask extends AsyncTask<Void,Void,Void>{
Activity activity;

public MyTask(Activity activity)
{
onAttach(activity);
}

public void onAttach(Activity activity)
{
this.activity=activity;
}

public void onDetach()
{
activity=null;
}

@Override
protected void onPreExecute() {
super.onPreExecute();
((MainActivity)activity).showpb();
((MainActivity)activity).hideres();

}

@Override
protected Void doInBackground(Void... params) {
try {
Thread.currentThread().sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
((MainActivity)activity).hidepb();
((MainActivity)activity).showres();

}
}


 

package com.mango.rotationproof;

import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {
Button btn;
TextView tv;
ProgressBar pb;
TaskFrag frag;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
tv = (TextView) findViewById(R.id.tv);
pb = (ProgressBar) findViewById(R.id.pb);

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
frag.begintask();
}
});
if(savedInstanceState==null)
{
frag=new TaskFrag();
getSupportFragmentManager().beginTransaction().add(frag,"tag").commit();
}
else
{
frag= (TaskFrag) getSupportFragmentManager().findFragmentByTag("tag");
showpb();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}



public void showpb()
{ if(frag.myTask!=null){
if(pb.getVisibility()!=View.VISIBLE)
{
pb.setVisibility(View.VISIBLE);
}}
}

public void hidepb()
{ if(frag.myTask!=null){
if(pb.getVisibility()!=View.GONE)
{
pb.setVisibility(View.GONE);
}}
}
public void showres()
{if(frag.myTask!=null){
if(tv.getVisibility()!=View.VISIBLE)
{
tv.setVisibility(View.VISIBLE);
}}
}
public void hideres()
{if(frag.myTask!=null){
if(tv.getVisibility()!=View.GONE)
{
tv.setVisibility(View.GONE);
}}
}
}

Comments