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水平来说,它看起来太深了,但无论如何,我会在以后尝试。我们曾经都是十足的傻瓜。没什么好羞愧的。