サーバーから画像を取得し、そのファイルをアプリの背景として使用しようとしています。そのためには AsyncTask を使用する必要があることは既に知っていますが、アプリを実行するとまだクラッシュまたはフリーズします。
私が使用するコードは次のとおりです。
AsyncTask を呼び出すには:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent BG = new Intent((Intent) DownloadBGTask.THREAD_POOL_EXECUTOR);
AsyncTask:
import java.net.URL;
import com.pxr.tutorial.json.Getbackground;
import android.os.AsyncTask;
public class DownloadBGTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Getbackground.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
// Things to be done while execution of long running operation
}
protected void onPostExecute(Long result) {
// xecution of result of Long time consuming operation
}
}
Getbackground.java:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import android.os.Environment;
public class Getbackground {
URL url;
public static long downloadFile(URL url2) {
try {
URL url = new URL ("http://oranjelan.nl/oranjelan-bg.png");
InputStream input = url.openStream();{
try {
File fileOnSD=Environment.getExternalStorageDirectory();
String storagePath = fileOnSD.getAbsolutePath();
OutputStream output = new FileOutputStream (storagePath + "/oranjelangbg.png");
try {
byte[] buffer = new byte[1000000];
int bytesRead = 0;
while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) {
output.write(buffer, 0, bytesRead);
}
} finally {
output.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
input.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
} catch (MalformedURLException ex) {
throw new RuntimeException(ex);
} catch (IOException e) {
throw new RuntimeException(e);
}
return 0;
}
}
PS、くだらないコードで申し訳ありません。私はこれに本当に慣れていないので、本当にばかげた間違いがあったとしても驚かないでください。