如何在Android中保持UI刷新?

苏罗尔·艾哈迈德(Suroor Ahmmad)

这是我的Android客户端代码:我正在将屏幕截图图像发送到客户端,并且正在客户端中接收并使用ImageView在UI中显示。

public class ScreenCast extends Activity{
ImageView iv;
Socket socket;
Bitmap bitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    MyTask task=new MyTask();
    task.execute();
}

private class MyTask extends AsyncTask<Void, Void, Bitmap>{
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if(bitmap!=null){
            Drawable ob=new BitmapDrawable(getResources(),bitmap);
            iv=(ImageView) findViewById(R.id.imageView1);
            iv.setBackgroundDrawable(ob);
        }else{
            Log.d("Bitmap null","Empty");
        }
    }

    @Override
    protected Bitmap doInBackground(Void... arg0){
        try {
            socket=new Socket("192.168.237.1",3434);
            ObjectInputStream ois=new ObjectInputStream(socket.getInputStream());
            byte[] buffer=(byte[]) ois.readObject();

            BitmapFactory.Options options=new BitmapFactory.Options();
            options.inMutable=true;
            bitmap = BitmapFactory.decodeByteArray(buffer, 0, buffer.length,options);
            return bitmap;
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}
}

现在,我遇到的问题是显示了第一个屏幕截图,但图像没有流式传输(如视频)。但是,当我更改方向时,将显示更新的屏幕截图。那么如何保持屏幕截图图像在UI中连续显示

在按照Mozarty的建议更新我的代码后,Logcat出现了。

01-13 18:12:29.665: E/AndroidRuntime(3915): FATAL EXCEPTION: AsyncTask #3
01-13 18:12:29.665: E/AndroidRuntime(3915): java.lang.RuntimeException: An error occured while executing doInBackground()
01-13 18:12:29.665: E/AndroidRuntime(3915):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at java.lang.Thread.run(Thread.java:856)
01-13 18:12:29.665: E/AndroidRuntime(3915): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
01-13 18:12:29.665: E/AndroidRuntime(3915):     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4867)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:947)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at android.view.View.requestLayout(View.java:15430)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at android.view.View.requestLayout(View.java:15430)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at android.view.View.requestLayout(View.java:15430)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at android.view.View.requestLayout(View.java:15430)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:292)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at android.view.View.requestLayout(View.java:15430)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at android.view.View.setBackgroundDrawable(View.java:14589)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at com.qube.screenshotapk.ScreenShotNew$MyTask.onProgressUpdate(ScreenShotNew.java:44)
 01-13 18:12:29.665: E/AndroidRuntime(3915):    at com.qube.screenshotapk.ScreenShotNew$MyTask.doInBackground(ScreenShotNew.java:67)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at com.qube.screenshotapk.ScreenShotNew$MyTask.doInBackground(ScreenShotNew.java:1)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-13 18:12:29.665: E/AndroidRuntime(3915):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-13 18:12:29.665: E/AndroidRuntime(3915):     ... 5 more
艾哈迈德·塞勒姆

您只运行一次任务,就只能得到一张图像

将此行添加到后期执行中以获取其他图像

 MyTask task=new MyTask();
task.execute();

- - 更新 - -

检查此代码以帮助您解决滞后问题

public class ScreenCast extends Activity {
ImageView iv;
Socket socket;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    MyTask task = new MyTask();
    task.execute();
}

private class MyTask extends AsyncTask<Void, Bitmap, Void> {

    @Override
    protected void onPostExecute(Void result) {
        //all images loaded
        super.onPostExecute(result);
    }
    @Override
    protected void onProgressUpdate(Bitmap... values) {

        super.onProgressUpdate(values);
        Bitmap bitmap = values[0];
        if (bitmap != null) {
            Drawable ob = new BitmapDrawable(getResources(), bitmap);
            iv = (ImageView) findViewById(R.id.imageView1);

iv.post(new Runnable (){
iv.setBackgroundDrawable(ob);
});



        } else {
            Log.d("Bitmap null", "Empty");
        }
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        //change this to your stopping condition i.e no more images
        while (true) {
            try {
                socket = new Socket("192.168.237.1", 3434);
                ObjectInputStream ois = new ObjectInputStream(
                        socket.getInputStream());
                byte[] buffer = (byte[]) ois.readObject();

                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inMutable = true;
                Bitmap bitmap = BitmapFactory.decodeByteArray(buffer, 0,
                        buffer.length, options);
                onProgressUpdate(bitmap);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Android中保持UI刷新?

来自分类Dev

如何在 Android 中保持 SharedPrefManager 更新

来自分类Dev

在 Android 中滑动刷新后如何保持 UI 更改

来自分类Dev

如何在Qt for Android中保持屏幕打开?

来自分类Dev

如何在Android Kitkat中保持服务活跃?

来自分类Dev

如何在Android中保持文本字段为空?

来自分类Dev

如何在Android Kitkat中保持服务活跃?

来自分类Dev

如何在 Android Studio 中保持方法折叠?

来自分类Dev

如何在 ActiveAdmin 中保持 UI 和内容本地化分开

来自分类Dev

如何在使用StartActivityForResult时刷新Android App的UI?

来自分类Dev

如何在列表中保持数据顺序

来自分类Dev

如何在Hadoop作业中保持状态?

来自分类Dev

如何在配方中保持幂等

来自分类Dev

如何在递归调用中保持值?

来自分类Dev

如何在Tensorflow中保持堆叠张量

来自分类Dev

如何在POST消息中保持换行

来自分类Dev

如何在JSF中保持登录值

来自分类Dev

如何在配方中保持幂等

来自分类Dev

如何在CSS中保持图像的长宽比?

来自分类Dev

如何在Firefox中保持通知打开?

来自分类Dev

如何在Redis中保持HTTP响应

来自分类Dev

如何在JPanel中保持长宽比

来自分类Dev

如何在Hadoop作业中保持状态?

来自分类Dev

ReactJS如何在cookie中保持状态

来自分类Dev

如何在UI路由器AngularJS中保持父级相同的同时仅更改子UI视图?

来自分类Dev

如何在刷新时保持认证状态?

来自分类Dev

如何在刷新时保持认证状态?

来自分类Dev

如何在Android中保持和拖动(重新定位)布局及其关联的布局

来自分类Dev

设备方向更改后如何在Android中保持ListView项目的高亮显示

Related 相关文章

热门标签

归档