我有一个可以从服务器下载图像的活动 但是应用程序在完成下载图像之前没有加载UI, 我正在使用此代码:
private Toolbar toolbar;
private ImageView downloadedImg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
downloadedImg = (ImageView) findViewById(R.id.Main_Image_ID);
toolbar = (Toolbar) findViewById(R.id.Main_Appbar_ID);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
NavigationDrawerFragment drawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.Main_Activity_navigation_drawer_ID);
drawerFragment.setUp(R.id.Main_Activity_navigation_drawer_ID, (DrawerLayout) findViewById(R.id.Main_DrawerLayout_ID), toolbar);
ImageDownloader task = new ImageDownloader();
Bitmap myImage;
try {
myImage = task.execute("https://drive.google.com/uc?id=0B51TujFYa0RBUUYzSE15WHZRR3c").get();
downloadedImg.setImageBitmap(myImage);
} catch (Exception e) {
e.printStackTrace();
}
Log.i("Interaction", "Button Tapped");
}
public void ViewMone(View view) {
startActivity(new Intent(MainActivity.this,MainWebViewActivity.class));
}
public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
HttpURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.connect();
InputStream inputStream = connection.getInputStream();
//to convert Image from string data to bitmap
Bitmap myBitmap = BitmapFactory.decodeStream(inputStream);
return myBitmap;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
答案 0 :(得分:2)
您未正确使用 AysncTask 类。通过调用get()
,您可以暂停主线程,直到下载图像。这就是用户界面感觉缓慢的原因。
相反,您应该从任务的onPostExecute
方法设置图像:
private Toolbar toolbar;
private ImageView downloadedImg;
@Override
protected void onCreate(Bundle savedInstanceState) {
// ... omitted ...
ImageDownloader task = new ImageDownloader();
task.execute("https://drive.google.com/uc?id=0B51TujFYa0RBUUYzSE15WHZRR3c");
}
// ... omitted ...
public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
HttpURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.connect();
InputStream inputStream = connection.getInputStream();
//to convert Image from string data to bitmap
Bitmap myBitmap = BitmapFactory.decodeStream(inputStream);
return myBitmap;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Bitmap result) {
downloadedImg.setImageBitmap(result);
}
}
答案 1 :(得分:0)
您必须异步执行此操作,而不是在主活动中执行此操作,否则在下载完成之前,页面将被阻止。有很多选择可以做到这一点。我认为在这个问题的接受答案中表示最好:
答案 2 :(得分:0)
如果您查看异步任务的文档,您会发现get()
具有以下描述
如果需要等待计算完成,然后检索其结果。
您应该在AsyncTask子类中实现onPostExecute并在那里处理您的图像,而不是调用get()
。 Android开发者页面上甚至有一个例子。
public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
<...>
@Override
protected void onPostExecute(Bitmap result) {
downloadedImg.setImageBitmap(result);
}
}