如何在android中自动调用方法?
我正在构建一个android应用程序,从arduino uno接收图像,以便将其连续显示为视频。我编写了一个异步任务,读取图像并在图像视图中显示,如何每隔一秒自动调用此方法。 这是我的任务 我制作了一个按钮来调用异步任务,但是如何让它继续被调用呢如何在android中自动调用方法?,android,android-asynctask,Android,Android Asynctask,我正在构建一个android应用程序,从arduino uno接收图像,以便将其连续显示为视频。我编写了一个异步任务,读取图像并在图像视图中显示,如何每隔一秒自动调用此方法。 这是我的任务 我制作了一个按钮来调用异步任务,但是如何让它继续被调用呢 class myAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params)
class myAsyncTask extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
mmInStream = tmpIn;
int byteNo;
try {
byteNo = mmInStream.read(buffer);
if (byteNo != -1) {
//ensure DATAMAXSIZE Byte is read.
int byteNo2 = byteNo;
int bufferSize = 7340;
int i = 0;
while(byteNo2 != bufferSize){
i++;
bufferSize = bufferSize - byteNo2;
byteNo2 = mmInStream.read(buffer,byteNo,bufferSize);
if(byteNo2 == -1){
break;
}
byteNo = byteNo+byteNo2;
}
}
}
catch (Exception e) {
// TODO: handle exception
}
return null;
}
protected void onPostExecute(Void result) {
super.onPostExecute(result);
bm1 = BitmapFactory.decodeByteArray(buffer, 0, buffer.length);
image.setImageBitmap(bm1);
}
}
类myAsyncTask扩展了AsyncTask
{
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
mmInStream=tmpIn;
int byteNo;
试一试{
byteNo=mmInStream.read(缓冲区);
如果(byteNo!=-1){
//确保已读取DATAMAXSIZE字节。
int byteNo2=byteNo;
int bufferSize=7340;
int i=0;
while(byteNo2!=缓冲区大小){
i++;
bufferSize=bufferSize-byteNo2;
byteNo2=mmInStream.read(buffer,byteNo,bufferSize);
if(byteNo2==-1){
打破
}
byteNo=byteNo+byteNo2;
}
}
}
捕获(例外e){
//TODO:处理异常
}
返回null;
}
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
bm1=位图工厂.decodeByteArray(缓冲区,0,缓冲区.length);
image.setImageBitmap(bm1);
}
}
如果它来自后台线程,一种可能是使用无界for循环。例如,假设AsyncTask当前执行以下操作:
private class MyTask extends AsyncTask<T1, Void, T3>
{
protected T3 doInBackground(T1... value)
{
return longThing(value);
}
protected void onPostExecute(T3 result)
{
updateUI(result);
}
}
私有类MyTask扩展了AsyncTask
{
受保护的T3背景(T1…值)
{
返回龙兴(值);
}
受保护的void onPostExecute(T3结果)
{
更新(结果);
}
}
然后将其改写为如下内容:
private class MyTask extends AsyncTask<T1, T3, T3>
{
protected T3 doInBackground(T1... value)
{
for (;;)
{
T3 result = longThing(value);
publishProgress(result);
Thread.sleep(1000);
}
return null;
}
protected void onProgressUpdate(T3... progress)
{
updateUI(progress[0]);
}
}
私有类MyTask扩展了AsyncTask
{
受保护的T3背景(T1…值)
{
对于(;;)
{
T3结果=龙兴(数值);
出版进度(结果);
睡眠(1000);
}
返回null;
}
受保护的void onProgressUpdate(T3…进度)
{
更新(进度[0]);
}
}
当然,您应该进行检查以中断循环(例如,当活动暂停或销毁时)
另一个选项是创建一个实例并反复调用postDelayed()。听说过
while循环吗?
最好使用计时器
使用一个生成的处理程序当我单击它时,我将收到图像,这个forloop将在一个未结束的线程中运行,如果我需要使用界面并点击athor按钮该怎么办?这就是为什么我说“如果它来自后台线程”:)显然它不应该从UI线程使用。那么我该怎么办?我扩展了示例,希望它有用。非常感谢你,但我需要在每次阅读图像时更新图像视图,之后,我需要自动读取另一个图像,我编写了一个异步任务,从输入流读取图像,但我不知道如何继续执行这个异步任务。
private class MyTask extends AsyncTask<T1, T3, T3>
{
protected T3 doInBackground(T1... value)
{
for (;;)
{
T3 result = longThing(value);
publishProgress(result);
Thread.sleep(1000);
}
return null;
}
protected void onProgressUpdate(T3... progress)
{
updateUI(progress[0]);
}
}