Android 尝试使用参数时,异步任务失败

Android 尝试使用参数时,异步任务失败,android,debugging,android-asynctask,Android,Debugging,Android Asynctask,伙计们。我有以下代码: 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.grap

伙计们。我有以下代码:

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;


    }

}
package com.example.httpprogress;
导入java.io.BufferedInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.net.URLConnection;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.os.AsyncTask;
公共类MyPicGetTask扩展异步任务{
InputStream=null;
BufferedInputStream bis=null;
位图bmp=null;
@凌驾
受保护位图doInBackground(URL…URL){
//TODO自动生成的方法存根
URL=URL[0];
试一试{
URLConnection conn=url.openConnection();
连接();
is=conn.getInputStream();
bis=新的BufferedInputStream(is);
bmp=位图工厂.decodeStream(bis);
}捕获(格式错误){
}捕获(IOE异常){
}最后{
试一试{
is.close();
二、关闭();
}捕获(IOE异常){
}
}
返回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()");




    }

}
package com.example.httpprogress;
导入java.io.BufferedInputStream;
导入java.io.InputStream;
导入java.net.MalformedURLException;
导入java.net.URL;
导入android.app.Activity;
导入android.graphics.Bitmap;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.Menu;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.ImageView;
公共类PicActivity扩展活动实现OnClickListener{
InputStream=null;
BufferedInputStream bis=null;
位图bmp=null;
私有URL;
//"http://192.168.0.30/03.jpg";
/*
私有类GetPictTask扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…s){
//TODO自动生成的方法存根
试一试{
url=新url(“http://192.168.0.93/image.php");
}捕获(格式错误的异常e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
试一试{
URLConnection conn=url.openConnection();
连接();
is=conn.getInputStream();
bis=新的BufferedInputStream(is);
bmp=位图工厂.decodeStream(bis);
}捕获(格式错误){
}捕获(IOE异常){
}最后{
试一试{
is.close();
二、关闭();
}捕获(IOE异常){
}
}
返回null;
}
};
*/
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pic);
最终ImageView图像=(ImageView)findViewById(R.id.imageView1);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
///////////
试一试{
url=新url(“http://192.168.0.30/03.jpg");
}捕获(格式错误){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
新建MyPicGetTask().execute(url);
setImageBitmap(bmp);
}
});
////////////////
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.pic,menu);
////////////////
返回true;
}
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
Log.d(“httpProgress”、“Onclick()”);
}
}
将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);
    }
}

然后,应该使用从doInBackground返回的位图在onPostExecute中更新UI

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

asyncTask子类需要访问image才能更新UI,因此将其作为内部类是确保它可以做到这一点的一种方法。

当MyPicGetTask是内部类时,它可以访问bmp字段。当您将其从活动中取出时,它将无法访问bmp类字段


我建议您阅读Google,并按照他们的示例进行操作。

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

你需要移动AsyncTask的
image.setImageBitmap(bmp)
内部
onPostExecute
方法谢谢,我忘记了我已经用web服务器关闭了我的虚拟机,(我知道,因为我使用了你的代码),我将来会使用它我知道。因此,正如您所看到的,我使用了两个不同的变量:一个在我的助手类中,一个在ActivityThank中。这很有用,但不是必需的,我可以使用get函数。正确的?如果我将MyTask创建为非InnerTask,则无法完成。如果将MyPicGetTask保持为独立类,则可以通过使用回调接口让它工作,以告知异步任务何时完成。哎呀,那太好了。但对于我的Java和Android水平来说,它看起来太深了,但无论如何,我会在以后尝试。我们曾经都是十足的傻瓜。没什么好羞愧的。