android


Generic Asynctask for multiple activities


Hi I am trying to implement a generic Asynctask in android. I have around 8 to 10 activities which uses same asynctask with different parameters. Task works well for each activity. But when I try to implement a UI component it crashes. Here is my code any suggestions
public class SyncTaskService extends AsyncTask<String, Void, Void> {
OnAsyncResult onAsyncResult;
String ServerResponse;
String LocalResponse;
int Operationtype=-1;
private Context mContext;
public SyncTaskService (Context context){
mContext = context;
}
public void setOnResultListener(OnAsyncResult onAsyncResult) {
if (onAsyncResult != null) {
this.onAsyncResult = onAsyncResult;
}
}
#Override
protected Void doInBackground(String... params) {
BackGroundTasks Obj_BackGroungTasks = new BackGroundTasks();
Operationtype = Integer.parseInt(params[0]);
if (onAsyncResult != null)
{
switch (Operationtype) {
case 1:
String Type = params[2];
ServerResponse=null;
ServerResponse= Obj_BackGroungTasks.getdetails(mContext,Type);
break;
default:
break;
}
}
if (ServerResponse!=null) {
onAsyncResult.onResultSuccess(ServerResponse);
} else {
onAsyncResult.onResultFail(ServerResponse +LocalResponse);
}
return null;
}
public interface OnAsyncResult {
public abstract void onResultSuccess(String message);
public abstract void onResultFail(String errorMessage);
}
and this is how I am using it in my activity
SyncTaskService task = new SyncTaskService(getActivity());
task.setOnResultListener(asynResult);
task.execute("5",promotype);
OnAsyncResult asynResult = new OnAsyncResult() {
#Override
public void onResultFail(final String errorMessage) {
Log.d("On Result Fail In Activity", ""+errorMessage);
Toast.makeText(getActivity(), "Task completed", Toast.LENGTH_LONG).show();
}
#Override
public void onResultSuccess(String message) {
Log.d("On Result Success In Activity", ""+message);
ServerResponse=message;
Toast.makeText(getActivity(), "Task completed", Toast.LENGTH_LONG).show(); //craches here
}
};
Here us logcat
11-08 16:25:17.705: E/AndroidRuntime(671): FATAL EXCEPTION: AsyncTask #1
11-08 16:25:17.705: E/AndroidRuntime(671): java.lang.RuntimeException: An error occured while executing doInBackground()
11-08 16:25:17.705: E/AndroidRuntime(671): at android.os.AsyncTask$3.done(AsyncTask.java:278)
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-08 16:25:17.705: E/AndroidRuntime(671): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
11-08 16:25:17.705: E/AndroidRuntime(671): at java.lang.Thread.run(Thread.java:856)
11-08 16:25:17.705: E/AndroidRuntime(671): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
11-08 16:25:17.705: E/AndroidRuntime(671): at android.os.Handler.<init>(Handler.java:121)
11-08 16:25:17.705: E/AndroidRuntime(671): at android.widget.Toast$TN.<init>(Toast.java:317)
11-08 16:25:17.705: E/AndroidRuntime(671): at android.widget.Toast.<init>(Toast.java:91)
11-08 16:25:17.705: E/AndroidRuntime(671): at android.widget.Toast.makeText(Toast.java:233)
11-08 16:25:17.705: E/AndroidRuntime(671): at packagename.Activity$1.onResultFail(Activity.java:157)
11-08 16:25:17.705: E/AndroidRuntime(671): at packagename.SyncTaskService.doInBackground(SyncTaskService.java:115)
11-08 16:25:17.705: E/AndroidRuntime(671): at packagename.SyncTaskService.doInBackground(SyncTaskService.java:1)
11-08 16:25:17.705: E/AndroidRuntime(671): at android.os.AsyncTask$2.call(AsyncTask.java:264)
11-08 16:25:17.705: E/AndroidRuntime(671): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-08 16:25:17.705: E/AndroidRuntime(671): ... 5 more
You need to override onPostExecuted() method. Basically, Asynctask has 4 important methods, three of which execute on the UI thread and one which executes in a background asynchronous thread:
onPreExecute() - executed on the UI thread where you should do whatever you want on the UI before your background process is executed ex. show a progress bar
doInBackground() - executed on a background thread and this is where you should do whatever heavy task need to do off the UI thread so that your app doesn't crash or your UI doesn't hang ex. make an API call to download. REMEMBER THAT YOU CANNOT INTERACT WITH ANY UI ELEMENTS HERE! You can also publish progress from here ex. Return file size downloaded every 200kb so that your progress bar can update
onPostExecute() - executed on the UI thread where you should handle everything you want to do on the UI after your task has executed ex. dismiss progress bar and show result of downloading file
onProgressUpdate() - executed on the UI thread when ever doInBackground() publishes progress so that you can keep your user updated in case of a long background process ex. update your progress bar percentage here
Hope this helps. You might also want to look at the documentation which might help you further to understand the full capabilities of Asynctask.
http://developer.android.com/intl/zh-tw/reference/android/os/AsyncTask.html
Happy coding :)

Related Links

How to get file path , When uploading a file to server?
Two Application's using sharedUserID - createPackageContext issue
EditText in ListView have repeating cursor position android
Data Changes in android wear app not reflecting in mobile app
Gradlew test not working
Where should async task be executed in fragment to update the view?
How to hide FAB is show in Android
Webservice call on current displayed fragment viewpager?
Animating custom view(leaf node in ViewHierarchy ) using ObjectAnimator is not smooth in android
Android Realm repalce refresh with waitForChange
Create Marker with lat and long from JSON file inside Assets folder
Android - how to check if ThreadPoolExecutor has reached the queue limit?
Failed to load resource: net::ERR_FILE_NOT_FOUND ionic error
Google Play Store not always shows current app version
Revert to MainActivity after pausing/exiting on SecondActivity
location.reload() causing cordova sqlite db to be locked

Categories

HOME
asp.net-web-api
fpga
pagination
interface
saml-2.0
requirements
gradient
pdfbox
newrelic
database-normalization
rom
permissions
hugo
regular-language
pearson-correlation
trac
nstableheaderview
selenium-ide
docx
intershop
red5
resourcebundle
slidetoggle
motion-detection
errbot
user-defined-functions
failover
ntp
postback
memory-address
hreflang
browser-extension
engine.io
bc
subclipse
microsoft-metro
lpsolve
apollostack
angular-http
vaadin-charts
procfile
servermanager
textsum
openal
wcftestclient
netbeans6.8
facebook-pixel
lightning
carrot2
git-flow
mach-o
vibrate
uicolor
scaffolding
custom-errors
forwarding
django-urls
google-books
fuelcms
page.js
rapidsvn
android-cookiemanager
angular-gettext
angular-carousel
wxformbuilder
conditionaltagsupport
ecslidingviewcontroller
gd-graph
inputmismatchexception
beaker-testing
ui-select2
process-explorer
time.h
mantle
dopostback
redis-py
nokia-s40
fragmenttransaction
jdb
cgimage
denied
mtu
message-passing
nstokenfield
google-wave
fault-tolerance
image-capture
cardspace
netbeans6.1

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App