I saw many dublicates of this questions ( here , here , here and here ) but i did not get solution for my problem.
This is my app's idea
Fetching contents from url and display it using textview on each button click.
(URL content will randomly generate different text for each refresh)
This is my old code of my app which worked perfectly but StackOverflow people advised me to use AsyncTask
I specified fetching URL contents operation in doInBackground() method and called new myAsyncTask.execute() in Button Click Event from onCreate.
It worked only for first click , and then my app crashed. It says AsyncTask should be called only once. But i want my TextView to be updated on each button click event.
So, What should i do now
Do I want to cancel my previous AsyncTask and call new one (or) I want to initialize new object for AsyncTask and call it again (which is the worst method)
How do i implement my idea in my app using AsyncTask or any Alternate?
This is my code:
public class MainActivity extends AppCompatActivity {
TextView resultView;String TAG="MainActivity kbt";
SmoothProgressBar mProgressBar;
Context context;
MyAsyncTask myAsyncTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// StrictMode.enableDefaults(); //Used to executes URL connection on MainThread without getting Exception
setContentView(R.layout.activity_main);
mProgressBar = (SmoothProgressBar) findViewById(R.id.progressBar);
StrictMode.enableDefaults();
resultView = (TextView) findViewById(R.id.result);
myAsyncTask=new MyAsyncTask();
// mProgressBar.setVisibility(SmoothProgressBar.INVISIBLE);
Button insert=(Button) findViewById(R.id.button);
insert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
myAsyncTask.execute();
}
});
}
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
String mTAG = "myAsyncTask";
@Override
protected void onPreExecute() {
mProgressBar.progressiveStart();
}
@Override
protected Void doInBackground(Void... arg) {
try {
getData();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void a) {
mProgressBar.progressiveStop();
}
}
public void getData() throws IOException {
String result = "";
InputStream isr = null;
URLConnection urlConnection = null;
URL url = new URL("http://kbtganesh.16mb.com/index.php");
Log.d(TAG,"After URL NOT WORKING"); //AFTER THIS.... NEXT LOG (ie GOT URL CONNETION) IS NOT PRINTED
urlConnection = url.openConnection();
Log.d(TAG, "GOT URL CONNETION");
Log.d(TAG, "GOT URL CONNECTED");
isr =urlConnection.getInputStream();
Log.d(TAG,"AFTER ISR EQ");
//convert response to string
try {
// BufferedReader reader = new BufferedReader(new InputStreamReader(isr,"iso-8859-1"),8);
BufferedReader reader = new BufferedReader(new InputStreamReader(isr));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
isr.close();
result=sb.toString();
}
catch(Exception e){
Log.e("log_tag", "Error converting result "+e.toString());
}
//parse json data
try {
resultView.setText(result);
}
catch(Exception e) {
Log.e("log_tag", "Couldn't set text, damnit.");
}
}
}
Thanks in advance... (: