-1
インターネットから画像をダウンロードしようとしています。現在、アプリは画像の一部のみをダウンロードしますが、停止します。私はAsyncTaskを使用しています。何をすべきかに関する提案はありますか?Androidからサーバーから画像をダウンロードする
私が手にエラーがある:
android.os.NetworkOnMainThreadException
at com.example.reynaldo.getimageserver.MainActivity$DownloadAsyncTask.onPostExecute(MainActivity.java:74)
W/System.err: at com.example.reynaldo.getimageserver.MainActivity$DownloadAsyncTask.onPostExecute(MainActivity.java:30)
これは私が持っているコードです:
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick (View view){
DownloadAsyncTask task = new DownloadAsyncTask();
task.execute(new String[] {"http://res.cloudinary.com/demo/image/upload/w_500,f_auto/sample.jpg" });
}
private class DownloadAsyncTask extends AsyncTask<String, Void, String> {
Bitmap bitmap = null;
InputStream in = null;
@Override
protected String doInBackground(String... urls){
int response = -1;
URL url;
try {
url = new URL("http://res.cloudinary.com/demo/image/upload/w_500,f_auto/sample.jpg");
URLConnection conn = url.openConnection();
if (!(conn instanceof HttpURLConnection))
System.out.println("This is wrong");
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
response = httpConn.getResponseCode();
if (response == HttpURLConnection.HTTP_OK) {
in = httpConn.getInputStream();
return "success";
}
}
catch (IOException e) {
System.out.println("IOException");
}
return "Download failed";
}
@Override
protected void onPostExecute(String result) {
//try {
bitmap = BitmapFactory.decodeStream(in);
/* in.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}*/
ImageView img = (ImageView) findViewById(R.id.image);
img.setImageBitmap(bitmap);
}
}
}
一つの問題は、AsyncTaskのonPostExecuteは、()UIスレッド上で実行され、あなたがUIスレッド上でのネットワーキングを行うことができない。あるAsyncTaskクラスを作成します。 doInBackground()の内部でビットマップをデコードし、onPostExecute()でビューに渡すことができます。 – Code4aliving
または、ピカソのようなイメージダウンローダー – theblitz
イメージダウンローダーのためにピカソまたはレトロフィットを使用することができます。 – HaroldSer