So in my Async Task  class doInBackground and detach methods i could use :

        @Override
protected Object *doInBackground*(Void... params) {

        MyActivityClass *checkedActivity*;
        synchronized(this) {
            *checkedActivity *= this.activity;
        }

if(*checkedActivity*!=null){
Logger.write("QuadrosMobileActivityTask ", " AsyncTask background
initialized "+"Current Activity: "+checkedActivity .getClass().getName(),
Logger.INFO);
return *checkedActivity *.doBackGroundRequest();
}else{
Logger.write("QuadrosMobileActivityTask ", "AsyncTask finished while no
Activity was attached.", Logger.INFO);
return null;}

}

and the detach method would change to:

void *detach*() {
    synchronized(this) {
        this.activity = null
    }
}


Still i need to study this more....thanks the same to both

regards,

2011/11/20 João Rossa <[email protected]>

> Thanks guys. The idea was to call a unique class whenever an activity had
> the need to launch tasks, but since i have parent activity where all the
> activities extend from, they would call the async task and each one would
> have a method that would used in the doinbackground method of said async
> task. Right now im using no reference to the activity in the doinbackground
> but because of this im extending the asynctask class i've created to
> acomodate the different needs to the different activities, but i thought it
> would be more direct if i had the logic to run in the async tasks right in
> the activities....
>
> regards,
>
>
> On Sat, Nov 19, 2011 at 1:19 PM, Kostya Vasilyev <[email protected]>wrote:
>
>>  Hi,
>>
>> The original code that you posted did contain concurrent (multithreaded)
>> reads and writes of the activity member variable. That concurrency was
>> causing null pointed exceptions in a *seemingly* impossible place. The
>> reason, as far as I can tell, you had concurrent access to the member
>> variable was that you wanted to delegate the actual background work to the
>> activity, while keeping your async task implementation generic and unaware
>> of the exact nature of background work.
>>
>> So, with this in mind, I can see two ways of fixing things:
>>
>> 1) Keeping your way of structuring the code, and adding proper thread
>> synchronization.
>>
>> Here is one way:
>>
>> void detach() {
>>     synchronized(this) {
>>         this.activity = null
>>     }
>> }
>>
>> ... elsewhere (IIRC)...
>>
>> void the_method_where_you_were_getting_a_null_pointer_exception() {
>>         MyActivityClass checkedActivity;
>>         synchronized(this) {
>>             checkedActivity = this.activity;
>>         }
>>         if (checkedActivity != null) {
>>             .....
>>         }
>> }
>>
>> There are other things to be careful with here, for example, the activity
>> may be paused, stopped, or its onDestroy called (on the UI thread) while
>> the async task's thread is still in its worker method. Accesses to member
>> variables of activity would also need to be synchronized, or preferably
>> avoided.... So don't undertake this unless you've learned at least the
>> basics of concurrent programming.
>>
>> 2) Restructuring the code in a more.... orthodox way, as described in the
>> docs and was already suggested on this thread by Streets of Boston and
>> TreKing (IIRC).
>>
>> Have your AsyncTask perform the work without delegating to the activity,
>> and only reference the activity (if any) on the UI thread, in
>> onPostExecute. This way you'll be avoiding concurrent reads/writes of the
>> activity member variable, because onPostExecute and detach are both
>> executed on the UI thread.
>>
>> Hope this helps.
>>
>> -- Kostya
>>
>> 19.11.2011 7:40, Bluemercury пишет:
>>
>> Hi there! Sorry for posting here again, but i was hoping if i could try
>> this sample, you said to put the synchronized in the detach method here:
>>
>>  void detach() {
>>  *activity=null;*
>>  }
>>
>>  in the asynctask, is this correct?but detach() is only called in the
>> activity and not the in the async task itself, i thought synchronized
>> methods assumed that they're both launched from 2 different threads....but
>> in this case the activity(UI thread) calls the detach method like you said,
>> but the async task doesnt, only the attach method...
>> --
>> You received this message because you are subscribed to the Google
>> Groups "Android Developers" group.
>> To post to this group, send email to [email protected]
>> To unsubscribe from this group, send email to
>> [email protected]
>> For more options, visit this group at
>> http://groups.google.com/group/android-developers?hl=en
>>
>>
>> --
>> Kostya Vasilyev
>>
>>  --
>> You received this message because you are subscribed to the Google
>> Groups "Android Developers" group.
>> To post to this group, send email to [email protected]
>> To unsubscribe from this group, send email to
>> [email protected]
>> For more options, visit this group at
>> http://groups.google.com/group/android-developers?hl=en
>>
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to