我想使用AsyncTask类从原始文件夹中检索图像。我正在研究这个样本数小时。我没有任何例外,但屏幕上什么都没有显示。可能错过了很多东西。请你检查我的代码。我又做错了什么
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);
}
}
答案 0 :(得分:4)
我看到的一些事情:
1)您可以使用raw
从R.raw.fileName
文件夹访问资源。
2)你不应该多次拨打setContentView()
3)无需投射AsyncTask
。
我建议你花一些时间浏览一些教程,这样你就可以获得一个可靠的Android基础。
答案 1 :(得分:2)
好的,所以这是最快的方式来解决您的特定问题(例如,获取工作代码段的最少更改),但我会跟进应该在这里的内容。
首先,当我完全按照您的方式运行您的代码时,我发现您在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();
在您的AsyncTask
:
@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_main.xml
才能执行此操作,但以下只是示例:
<强> activity_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>
现在使用上面的布局文件,您可以将onCreate()
方法的开头更改为如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img = (ImageView) findViewById(R.id.image_view);
Myclass=(asynclass) new asynclass().execute();
}
习惯使用资源文件将使以后更容易加载多个图像和视图。
我希望这有帮助!
答案 2 :(得分:0)
这段代码与@ Emmanuel的评论应该有效。花时间比较你和我的代码。阅读教程。并查看OpenSource库中的一些资源。
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);
}
}
}
}