How to update View object on main thread by background thread

by npak...@gmail.com » Wed, 04 Mar 2009 02:01:18 GMT


Sponsored Links
 Hi all,
My purpose is very simple : each 1second, I want to redraw an object
on different place on background.
I do not know where my error on this code below. Hope that you can
show me or give me an advice to fix this problem

Here is my code
**********************************************************************************************************************
public class My_View extends View{

    private Bitmap mBackground_img;
    private Drawable mMoveObject;
    private int mObjectw,mObjecth;
    private int Dx,Dy;

    private Handler myHandler = new Handler();
    private long lasttime;
    public My_View(Context context,AttributeSet ats,int ds)
    {
        super(context,ats,ds);
        init(context);
    }
    public My_View(Context context,AttributeSet ats)
    {
        super(context,ats);
        init(context);
    }
    public My_View(Context context)
    {
        super(context);
        init(context);
    }

public void change()
    {
        invalidate();
    }
private void init(Context context)
    {
        Resources res     = context.getResources();
        mMoveObject        = res.getDrawable
(R.drawable.lander_firing);
        mBackground_img = BitmapFactory.decodeResource(res,
R.drawable.my_pic);
        mObjectw = mMoveObject.getIntrinsicWidth();
        mObjecth = mMoveObject.getIntrinsicHeight();
        Dx = Dy  = 0;

        lasttime = System.currentTimeMillis() + 1000;
        Thread mthread = new Thread(null,doBackground,"Background");
        mthread.start();
    }
    private Runnable doBackground = new Runnable()
    {
        public void run()
        {
            long now = System.currentTimeMillis();
            if(lasttime < now )
            {
                Dx = Dx + 10;
                Dy = Dy + 10;
                lasttime = now + 1000;
                myHandler.post(change_view);
             }
        }
    };
    private Runnable change_view = new Runnable()
    {
        public void run()
        {
            change();
        }
    };
    @Override
    public void onDraw(Canvas canvas)
    {
        canvas.drawBitmap(mBackground_img,0 ,0 , null);
        mMoveObject.setBounds(Dx, Dy, Dx+mObjectw, Dy+mObjecth);
        mMoveObject.draw(canvas);
    }
}
**********************************************************************************************************************
Hope to see your reply soon,
Thanks in advance,
NPAK

--~--~---------~--~----~------------~-------~--~----~



How to update View object on main thread by background thread

by Clay » Wed, 04 Mar 2009 15:15:40 GMT


 o just from the basic use case I dont know that I would use a
handler, basically I really like Romain Guy's implementation for
background user tasks that do things and then update the screen, its
based on his userTask implementation:


http://code.google.com/p/apps-for-android/source/browse/trunk/Photostream/src/com/google/android/photostream/UserTask.java

so to extend this, it uses generics *very wisely* so you can make any
model you want for both the doInBackground params which returns the
third arg, and becomes the param for onPostExecute.

/**
* Background task to verify the create user action. When the
action comes back
* it could inform the client to sync all data if the username and
password match
* or that there was a validation error like the user already
exists, or that
* this is a new user and that it successfully created it.
*
*/
private class PostActionTask extends UserTask<Object, Void,
ActionResult> {
public ActionResult doInBackground(Object... params) {
ActionResult result =
new ActionResult();
result.setActionStatus("FAILED");

Action actionToRun = (Action)params[0];

try {
result =
RpcActionClient.executeAction(
actionToRun,

MomentaryNowApp.getString("app_momentary_now_server"),

MomentaryNowApp.getInteger("app_momentary_now_server_port"),

MomentaryNowApp.getString("app_momentary_action_endpoint")) ;

} catch (IOException e) {
Log.e(TAG, "IOException:"+e.getMessage());
} catch (HttpException e) {
Log.e(TAG, "HttpException:"+e.getMessage());
} catch (URISyntaxException e) {
Log.e(TAG, "URISyntaxException:"+e.getMessage());
}
return result;
}

@Override
public void onPostExecute(ActionResult result) {
Log.d(TAG, "result:"+result.getActionStatus());
if(result.getActionStatus().equals("SUCCESS"))
{
//get the progress bar to update
ProgressBar progressBar =

(ProgressBar)findViewById(R.id.create_keyword_send_progress);
progressBar.setVisibility(View.GONE);

ImageView checked =

(ImageView)findViewById(R.id.create_keyword_send_toggle);
checked.setVisibility(View.VISIBLE);

}
}
}

secondly it is my understanding that AlarmManager is the timer
infrastructure you would most likely use
and that it would then call your background task.

http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/app/AlarmController.html

I am sure there are other ways to do this but this would be the way I
would try if I was doing what you told me.

Clay



On Mar 2, 11:32pm, "npak...@gmail.com" <npak...@gmail.com> wrote:
--~--~---------~--~----~----


Sponsored Links


How to update View object on main thread by background thread

by Clay » Thu, 05 Mar 2009 10:54:30 GMT


 ou have two threads one you post, the other you start...

again I wouldnt endorse the way your trying to manage your threading
in this case, and Romain (on the developer team) seems to recommended
doing background updates to activity views using update task so I
think you might benefit by rethinking your approach.

generally I would post runnable to handlers like this *if you must*

private void updateProgress(int amount){
// Update the progress bar
mProgressStatus = amount;
mHandler.post(new Runnable() {
public void run() {
mProgress.setProgress(mProgressStatus);
}
});
}

So basically it is possible to hammer that square peg into your round
hole if you wish, I just wont be the one to do it.

Respectfully,

Clay



On Mar 3, 11:55pm, Anh Khoa Nguyen Pham <npak...@gmail.com> wrote:
--~--~---------~--~----~------------~-------~--~----~



Other Threads

1. Using osmdroid via SVN and Eclipse

Hey guys - I'm very new to Android development... I'm mostly a .NET
guy :)

I have Eclipse set up with the ADT plugin, and I've configured
Subversive.  I've gone ahead and configured a project that shows up in
my "Package Explorer", and it says "> OSM 83". etc.  My question now
is what steps I need to take to be able to use that code/those classes
in my own app.

"My own app" is a sample Hello World-type app that I have running as
another project.  I was figuring I'd modify the default view of that
app and use the osmdroid map as my "HelloMap".

So my question might be more in how to take the SVN tree and
incorporate it with another app (do I have to set up paths to the
project in my other app, etc).

Any help/pointers would be greatly appreciated...!

-- 

2. How to handle call button

Hi,
I am new to android world.
I have created a application, which basically calls a predefined
number, when a button on my view is clicked.

what i want to do is, if some one press the call Key on the device,
and not the button on my view (it's important), the application should
do the same thing.

any one has any idea?

Thanks.

-- 

3. android xml files

4. Issue with playing audio/video from remote url

5. Issue with playing audio/video from remote url(HTTP/RTSP)

6. SDK r3 on Ubuntu 9.10

7. Are the standards for images/icons still valid?