0

伙计们。我有这个代码:

package com.example.httpprogress;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;

public class MyPicGetTask extends AsyncTask<URL , Void, Bitmap>{


    InputStream is = null;
    BufferedInputStream bis = null;
    Bitmap bmp = null;


    @Override
    protected Bitmap doInBackground(URL... urls) {
        // TODO Auto-generated method stub

        URL url = urls[0];


        try {
               URLConnection conn = url .openConnection();
               conn.connect();
               is = conn.getInputStream();
               bis = new BufferedInputStream( is );
               bmp = BitmapFactory.decodeStream( bis );
            } catch (MalformedURLException e) {

            } catch (IOException e) {

            } finally {
               try {
                  is.close();
                  bis.close();
               } catch (IOException e) {

               }
            }
        return bmp;


    }

}

它失败了,但如果我使用 AsyncTask 并将这个类描述为我的活动中的内部 - 没关系。我不能说原因,因为我无法调试,我可以看到调试选项卡在失败时打开,但它对我来说没有信息。有任何想法吗?对不起我的菜鸟问题

那是我的活动:

package com.example.httpprogress;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

public class PicActivity extends Activity implements OnClickListener{

    InputStream is = null;
    BufferedInputStream bis = null;
    Bitmap bmp = null;
    private URL url;
    //"http://192.168.0.30/03.jpg";
     /*
    private class getPicTask extends AsyncTask<Void, Void, Void>{

        @Override
        protected Void doInBackground(Void... s) {
            // TODO Auto-generated method stub


            try {
                url = new URL("http://192.168.0.93/image.php");
            } catch (MalformedURLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            try {
                   URLConnection conn = url .openConnection();
                   conn.connect();
                   is = conn.getInputStream();
                   bis = new BufferedInputStream( is );
                   bmp = BitmapFactory.decodeStream( bis );
                } catch (MalformedURLException e) {

                } catch (IOException e) {

                } finally {
                   try {
                      is.close();
                      bis.close();
                   } catch (IOException e) {

                   }
                }
            return null;


        }



    };

    */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pic);




        final ImageView image = (ImageView) findViewById(R.id.imageView1);


        image.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {


        ///////////

                try {
                    url =  new URL("http://192.168.0.30/03.jpg");
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


                new MyPicGetTask().execute(url);


                image.setImageBitmap(bmp);


            }
        });


            ////////////////
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.pic, menu);


        ////////////////


        return true;
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

        Log.d("httpProgress", "Onclick()");




    }

}
4

4 回答 4

1

将 Log.d() 代码添加到 doInBackground(...) 以打印出所有发生的异常。那应该告诉你出了什么问题,例如

try {
    URLConnection conn = url .openConnection();
    conn.connect();
    is = conn.getInputStream();
    bis = new BufferedInputStream( is );
    bmp = BitmapFactory.decodeStream( bis );
} catch (Exception e) {
    Log.d("Async","EXCEPTION",e);
} finally {
    try {
        is.close();
        bis.close();
    } catch (IOException e) {
        Log.d("Close","EXCEPTION",e);
    }
}
于 2013-04-11T19:35:47.377 回答
0

如果您AsyncTask将它用作您调用它的活动之外的公共类,则需要接收该活动的上下文。这里有很多帖子,这里这里解释了如何设置它。

于 2013-04-11T20:13:13.113 回答
0

您从 doInBackground 返回的位图应该用于在 onPostExecute 中更新您的 UI。

protected void onPostExecute(Bitmap bitmap) {
    image.setImageBitmap(bitmap);
}

您的 asyncTask 子类需要访问图像才能更新 UI,因此将其作为内部类是确保它可以执行此操作的一种方法。

于 2013-04-11T19:48:41.787 回答
0

当 MyPicGetTask 是一个内部类时,它可以访问 bmp 字段。当您将其从活动中拉出时,它会失去对 bmp 类字段的访问权限。

我建议阅读 Google 的文档并按照他们的AsyncTasks示例进行操作。

于 2013-04-11T19:50:55.353 回答