Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中自动调用方法?_Android_Android Asynctask - Fatal编程技术网

如何在android中自动调用方法?

如何在android中自动调用方法?,android,android-asynctask,Android,Android Asynctask,我正在构建一个android应用程序,从arduino uno接收图像,以便将其连续显示为视频。我编写了一个异步任务,读取图像并在图像视图中显示,如何每隔一秒自动调用此方法。 这是我的任务 我制作了一个按钮来调用异步任务,但是如何让它继续被调用呢 class myAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params)

我正在构建一个android应用程序,从arduino uno接收图像,以便将其连续显示为视频。我编写了一个异步任务,读取图像并在图像视图中显示,如何每隔一秒自动调用此方法。 这是我的任务 我制作了一个按钮来调用异步任务,但是如何让它继续被调用呢

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]);
     }
 }