Android 对异步图像加载感到困惑吗
我尝试使用AsyncTask类从原始文件夹中检索图像。我花了几个小时来研究这个样品。我没有任何异常,但屏幕上不会显示任何内容。可能遗漏了很多内容。请检查我的代码。我又做错了什么Android 对异步图像加载感到困惑吗,android,Android,我尝试使用AsyncTask类从原始文件夹中检索图像。我花了几个小时来研究这个样品。我没有任何异常,但屏幕上不会显示任何内容。可能遗漏了很多内容。请检查我的代码。我又做错了什么 public class MainActivity extends Activity { ImageView img; asynclass Myclass; @Override protected void onCreate(Bundle savedInstanceState) {
public class MainActivity extends Activity {
ImageView img;
asynclass Myclass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img=new ImageView(this);
/***
* Field[] filelds=R.raw.class.getFields();
String [] names=new String[filelds.length];
for (int i = 0; i < filelds.length; i++) {
names[i]=filelds[i].getName()+".jpg";
}
*
*
*
* */
//Toast.makeText(MainActivity.this, names[0], 0).show();
String s="android.resource://"+getApplication().getPackageName()+"/raw/d.jpg/";
this.setContentView(img,
new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
Myclass=(asynclass) new asynclass().execute(s);
}
public class asynclass extends AsyncTask<String, Void, Bitmap>{
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bmp=null;
bmp=BitmapFactory.decodeFile(params[0]);
return bmp;
}
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if(result!=null){
img.setImageBitmap(result);
}
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
}
公共类MainActivity扩展活动{
图像视图img;
异步类Myclass;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img=新图像视图(本);
/***
*字段[]filelds=R.raw.class.getFields();
字符串[]名称=新字符串[filelds.length];
for(int i=0;i
我看到的一些事情:
1) 您可以使用R.raw.fileName
从raw
文件夹访问资源
2) 您不应该多次调用setContentView()
3) 无需强制转换您的异步任务
<>我建议你花些时间浏览一些教程,这样你就可以得到一个坚实的Android基础。 好的,所以这是修复你的特定问题的最快的方法(如在最少的改动中得到一个工作片段),但是我将继续关注这里应该做的。
首先,当我完全按照您的方式运行代码时,我发现您在AsyncTask
中得到的结果返回null
。这是因为您给出的绝对文件路径不是BitmapFactory
所要的
作为快速修复,请进行以下更改:
//Remove this line
//String s="android.resource://"+getApplication().getPackageName()+"/raw/d.jpg/";
this.setContentView(img,
new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
//Remove the "s" from your execute
Myclass=(asynclass) new asynclass().execute();
在您的异步任务中
:
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bmp=null;
//Change this line to use decodeResource instead of decodeFile
bmp=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.raw.d);
return bmp;
}
这将使您的代码正常工作,但它不便于复制
现在,关于如何操作,您需要调用两次setContentView()
,这是多余的,然后创建一个ImageView
,并用不同的布局资源替换您设置的布局资源
为此,您需要查看xml文件activity\u main.xml
,但以下只是它的一个示例:
活动\u main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
习惯使用资源文件将使以后加载多个图像和视图更加容易
我希望这能有所帮助!这段带有@Emmanuel注释的代码应该可以工作。花点时间比较一下你的和我的代码。阅读教程。并在开源库中查看一些源代码
public class MainActivity extends Activity {
private ImageView mImage;
private ImageLoader loader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 2) You shouldn't call setContentView() more than once
setContentView(R.layout.activity_main);
mImage = new ImageView(this);
// 3) No need to cast your AsyncTask.
new ImageLoader().execute(R.raw.d);
}
public class ImageLoader extends AsyncTask<Integer, Void, Bitmap> {
@Override
protected Bitmap doInBackground(Integer... params) {
// 1) You can access resources from the raw folder using R.raw.fileName
InputStream is = getResources().openRawResource(params[0]);
Bitmap bitmap = BitmapFactory.decodeStream(is);
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
if(result != null){
mImage.setImageBitmap(result);
}
}
}
}
公共类MainActivity扩展活动{
私有图像视图;
私人图像加载器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//2)不应多次调用setContentView()
setContentView(R.layout.activity_main);
mImage=新图像视图(此);
//3)无需强制执行异步任务。
新的ImageLoader().execute(R.raw.d);
}
公共类ImageLoader扩展了异步任务{
@凌驾
受保护位图doInBackground(整数…参数){
//1)您可以使用R.raw.fileName从raw文件夹访问资源
InputStream=getResources().openRawResource(参数[0]);
位图位图=BitmapFactory.decodeStream(is);
返回位图;
}
@凌驾
受保护的void onPostExecute(位图结果){
如果(结果!=null){
mImage.setImageBitmap(结果);
}
}
}
}
为什么要调用setContentView
方法两次?在decodeFile
之后bmp
是否为空?正如@Emmanuel所说,您有很多基本错误,请尝试花些时间开始使用Android。
public class MainActivity extends Activity {
private ImageView mImage;
private ImageLoader loader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 2) You shouldn't call setContentView() more than once
setContentView(R.layout.activity_main);
mImage = new ImageView(this);
// 3) No need to cast your AsyncTask.
new ImageLoader().execute(R.raw.d);
}
public class ImageLoader extends AsyncTask<Integer, Void, Bitmap> {
@Override
protected Bitmap doInBackground(Integer... params) {
// 1) You can access resources from the raw folder using R.raw.fileName
InputStream is = getResources().openRawResource(params[0]);
Bitmap bitmap = BitmapFactory.decodeStream(is);
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
if(result != null){
mImage.setImageBitmap(result);
}
}
}
}