0

サーバーから画像をダウンロードし、SD カードに保存して表示したい。私はそのコードを書きましたが、動作しません。バグはありませんが、画像ではなく黒い画面しか表示されません。

public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    MyTask mt = new MyTask();
    mt.execute();

    Intent intent = new Intent();  
    intent.setAction(android.content.Intent.ACTION_VIEW);  
    File file = new File("/sdcard/askeroid/logos/1_mobile.png");  
    intent.setDataAndType(Uri.fromFile(file), "image/*");  
    startActivity(intent); 
}  

クラスMyTask
は AsyncTask を拡張します {

@Override
protected Void doInBackground(Void... params) {
    try{
        URL url = new URL("http://ed.sadko.mobi/logo/logo_1mobile.png");
        URLConnection connection = url.openConnection();
        connection.connect();

        InputStream input = new BufferedInputStream(url.openStream());
        OutputStream output = new FileOutputStream("/sdcard/askeroid/logos/1_mobile.png");

        output.flush();
        output.close();
        input.close();

    } catch(Exception e){e.printStackTrace();}
  return null;
}

}

4

2 に答える 2

1

次のアクティビティに移る前に、ダウンロードの終了を待つ必要はありません。

AsyncTaskを使用して画像をダウンロードし、 でdoInBackground次のアクティビティを開始することをお勧めしますonPostExecute

何かのようなもの:

AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
    @Override protected Long doInBackground(Void ... urls) {
        // download the image
    }

    @Override protected void onPostExecute(Void result) {
        // start new activity...
    }
};
task.execute();

また、SD カードへのパスはデバイスによって異なる場合があることに注意してください。正しいアクセス方法については、こちらをご覧ください。

于 2012-10-10T21:39:02.253 に答える
1

+1 AsyncTask を使用するための答えは、Android でのスレッド化を非常に簡単にします。もう 1 つの問題は、 と を開いてInputStreamも、OutputStream実際には入力から何も読み取らず、出力にも何も書き込まないため、SD カードのファイルが空になることです。

于 2012-10-10T21:45:53.427 に答える