【发布时间】:2014-01-31 22:52:26
【问题描述】:
我正在编写一个显示来自网络的随机 JPG 图像的 Android 应用。如果按下按钮,应用程序会向 http://imgur.com/random 发送 GET 请求,并从服务器的响应中将 URL 保存为字符串(参见代码)。
我使用 StrictMode.setThreadPolicy 让它工作,但使用 AsyncTask 无法做到。
我试过把.JPG地址的提取放在doInBackground中,而改变图片的实际过程放在onPostExecute中,像这样:
public class MainActivity extends Activity {
// Page "http://imgur.com/random" redirects users to a random page;
// After the redirect, the URL will be something like "http://imgur.com/gallery/XXXXXX";
// Actual image is at "http://i.imgur.com/XXXXXX.jpg"
private final String WHERE = "http://imgur.com/random";
private ImageExtractor ie;
private class ATask1 extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
// Go to WHERE and get a valid URL to a random .jpg image
ie = new ImageExtractor();
ie.extractImageURL(WHERE);
return null;
}
@Override
protected void onPostExecute(String result) {
// Change the image in ImageView based on the new URL
ImageView i = (ImageView)findViewById(R.id.imageDisplay);
try {
Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(ie.getImageURL()).getContent());
i.setImageBitmap(bitmap);
} catch (Exception e) {
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// Method called when the button is pressed
public void getNewImage(View v) {
new ATask1().execute("");
}
....
}
public class ImageExtractor {
private final String USER_AGENT = "Mozilla/5.0";
private String imageURL;
public void extractImageURL(String address) {
String returnedURL;
try {
// Create URL object based on passed argument
URL url = new URL(address);
// Send GET request
HttpURLConnection conn = (HttpURLConnection)(url.openConnection());
conn.setRequestMethod("GET");
conn.setRequestProperty("User-Agent", USER_AGENT);
// Response code of the answer
conn.getResponseCode();
// Create and save image URL as a string
returnedURL = conn.getURL().toString();
imageURL = returnedURL.replace("http://imgur.com/gallery/", "http://i.imgur.com/") + ".jpg";
}
catch (IOException e) {
}
}
// Return image URL as a string;
// http://i.imgur.com/XXXXXX.jpg
public String getImageURL() {
return imageURL;
}
}
现在,如果我按下按钮,随机 .JPG 的地址会正确存储在 imageURL 中,但之后没有任何反应。到目前为止我所做的是否正确?我是否需要为 BitmapFactory 部分创建一个新的 AsyncTask/Thread 或类似的东西?具体应该如何实现?
感谢您的帮助!
【问题讨论】: