【问题标题】:Multiple imageView refreshing in Android using asynctasks?使用异步任务在Android中刷新多个imageView?
【发布时间】:2012-01-17 10:00:40
【问题描述】:

我要做的是在单个活动上播放视频,视频数量未定义,可以从 1 到 8,在我的情况下,视频是一个图像序列,其中每个图像都是从摄像头下载的互联网使用固定时间间隔。

做单个视频活动不是问题,我可以使用 ImageView 和 AsyncTask 来制作,当我尝试制作多个视频活动时,使用此方法的许多实例不起作用,只能播放一个视频。我不知道到底发生了什么,但我认为这可能是由于 UIThread 导致的与货币有关的问题。

这里使用的AsyncTask代码:

private class AsyncTask_LiveView extends AsyncTask<String, Integer, Void> 
{   
    private String sImageMessage = "";

    private final WeakReference<ImageView> imageViewReference;
    private Bitmap bmImage = null;
    private String url = "";
    private String usr = "";
    private String pwd = "";
    private utils u = new utils();

    public AsyncTask_LiveView(ImageView imageView, String Url, String Usr, String Pwd)
    {
        imageViewReference = new WeakReference<ImageView>(imageView);
        url = Url;
        usr = Usr;
        pwd = Pwd;
    }

    // automatically done on worker thread (separate from UI thread)
    @Override
    protected Void doInBackground(final String... args) 
    {
        while(!isCancelled())
        {
            if(isCancelled())
                 return null;

            SystemClock.sleep(200);

            Log.v("ImageDownload","test");
            bmImage = u.DownloadBitmapFromUrl(url, usr, pwd);

            publishProgress(0);
        }

        return null;
    }

    // can use UI thread here
    @Override
    public void onProgressUpdate(Integer... i)
    {
        Log.v("Image", "Setup Image");
        if (imageViewReference != null) {
            ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                imageView.setImageBitmap(bmImage);
            }
        }
    }
 }

我以这种方式启动 AsyncTask:

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layoutliveviewdouble);

        this.imgV1 = (ImageView ) findViewById(R.id.imageView1);
    aTaskImgV1 = new AsyncTask_LiveView(imgV1,
                                        URL1,
                                        "",
                                        "");


    this.imgV2 = (ImageView ) findViewById(R.id.imageView2);
    aTaskImgV2 = new AsyncTask_LiveView(imgV2,
                                        URL2,
                                        "root",
                                        "jenimex123");

    aTaskImgV1.execute();
    aTaskImgV2.execute();
}

DownloadBitmapFromUrl 方法是:

public Bitmap DownloadBitmapFromUrl(String imageURL, final String usr, final String pwd) {  //this is the downloader method
    try {
        URL url = new URL(imageURL); 


        /* Open a connection to that URL. */
        HttpURLConnection ucon = (HttpURLConnection) url.openConnection();
        ucon.setRequestMethod("GET");
        ucon.setDoOutput(true);
        Authenticator.setDefault (new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication (usr, pwd.toCharArray());
            }
        });
        ucon.connect();

        /*
         * Define InputStreams to read from the URLConnection.
         */
        InputStream is =  ucon.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);

        /*
         * Read bytes to the Buffer until there is nothing more to read(-1).
         */
        ByteArrayBuffer baf = new ByteArrayBuffer(100000);
        int current = 0;
        while ((current = bis.read()) != -1) {
                baf.append((byte) current);
        }

        /* Convert the Bytes read to a String. */
        Bitmap bmp = BitmapFactory.decodeByteArray(baf.toByteArray(), 0, baf.length());

        return bmp;
    } catch (Exception e) {
            //Log.d("ImageManager", "Error: " + e);
        return null;
    }
}

有什么想法吗?

解决方案:(21/01/11)

线束:

Authenticator.setDefault (new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication (usr, pwd.toCharArray());
            }
        });

正在制动机制。实际上,全局只能设置一个凭据对 a,而其他下载进程则停留在请求使用错误凭据的过程中。

解决办法是:

String authString = usr + ":" + pwd;
byte[] authEncBytes = Base64.encode(authString.getBytes(), Base64.DEFAULT);
String authStringEnc = new String(authEncBytes);
ucon = (HttpURLConnection) url.openConnection();

if(_usr != "")
   ucon.setRequestProperty("Authorization", "Basic " + authStringEnc);

谢谢大家。

【问题讨论】:

  • 如何启动这些 AsyncTasks?
  • 你能给我看看它卡住的地方周围的日志吗(15-20行)?
  • 我会一直下班到星期四。我会在我被卡住的那一刻写日志。感谢您愿意帮助我。

标签: android multithreading imageview multimedia


【解决方案1】:

我认为你应该为每个ImageView 使用唯一的AsyncTask_LiveView

【讨论】:

    【解决方案2】:

    这个函数支持多线程吗?

    bmImage = u.DownloadBitmapFromUrl(url, usr, pwd);
    

    【讨论】:

    • 对象 "u" 是每个 AsyncTask 中的一个新实例,所以我认为是。
    【解决方案3】:

    看起来您在 downloadBitmapFromUrl(..) 方法中调用的某些方法涉及某些公共对象的同步。尝试在此方法的每个部分添加一些额外的日志记录,看看每个线程卡在哪里。我会这样做:

    public Bitmap downloadBitmapFromUrl(String imageURL, final String usr, final String pwd) {  //this is the downloader method
        try {
        ...
        Log.i(toString() + " in " + Thread.currentThread(), "is about to open connection...");
        HttpURLConnection ucon = (HttpURLConnection) url.openConnection();
        Log.i(toString() + " in " + Thread.currentThread(), "has opened connection");
    
        ...
    

    等等。

    【讨论】:

    • 发现另一个阻塞的AsyncTask(我只测试了2个视频流的情况)卡在了while ((current = bis.read()) != -1) { baf.append( (字节)当前);再次:有什么想法吗?提前致谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多