[英]AsyncTask - Am I using it right?
我正在編寫一個Android應用,該應用顯示來自網絡的隨機JPG圖像。 如果按下按鈕,則該應用會將GET請求發送到http://imgur.com/random ,然后從服務器的響應中將URL保存為JPG圖像的String(請參見代碼)。
我使用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或類似的東西? 應該如何實施?
謝謝你的幫助!
在我看來還可以。 只是一件事:在doInBackground()
方法你返回null
-請記住,這是你的參數onPostExecute()
方法會收到,所以基本上String result
將是無效的。 但就您而言,只要您不以錯誤的方式使用它,就可以。
回答您的問題:很難說出錯誤在哪里,但是處理AsyncTask
的方式對我來說似乎是正確的。 您不需要聲明新的Thread
或AsyncTask
來執行extractImageURL(WHERE)
作業,畢竟AsyncTask
已經是一個Thread
並將在后台執行。 我會考慮在您的所有AsyncTask
代碼中放置幾個Log.d()
實例,以查看錯誤在哪里,但是就結構而言,它似乎沒有任何問題。
您已經有了一般概念,但對此感到好奇:
Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(ie.getImageURL()).getContent());
您正在UI線程上的onPostExecute
中執行此操作,這看起來非常像網絡請求。 較新版本的Android將完全拒絕這樣做,並拋出NetworkOnMainThreadException
。 您似乎唯一要做的就是請求獲取圖像路徑的請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.