2016-11-08 13 views
-2

で遅いUIを持っています。私はこのコードを使用してい 、私はサーバ から画像をダウンロードするが、それは、画像をダウンロード仕上げされるまでアプリはUIをロードすることができない活動をしました私のAndroidアプリ

private Toolbar toolbar; 
private ImageView downloadedImg; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    downloadedImg = (ImageView) findViewById(R.id.Main_Image_ID); 
    toolbar = (Toolbar) findViewById(R.id.Main_Appbar_ID); 

    setSupportActionBar(toolbar); 

    getSupportActionBar().setDisplayShowHomeEnabled(true); 

    NavigationDrawerFragment drawerFragment = (NavigationDrawerFragment) 
      getSupportFragmentManager().findFragmentById(R.id.Main_Activity_navigation_drawer_ID); 
    drawerFragment.setUp(R.id.Main_Activity_navigation_drawer_ID, (DrawerLayout) findViewById(R.id.Main_DrawerLayout_ID), toolbar); 


    ImageDownloader task = new ImageDownloader(); 
    Bitmap myImage; 

    try { 
     myImage = task.execute("https://drive.google.com/uc?id=0B51TujFYa0RBUUYzSE15WHZRR3c").get(); 

     downloadedImg.setImageBitmap(myImage); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    Log.i("Interaction", "Button Tapped"); 
} 

public void ViewMone(View view) { 
    startActivity(new Intent(MainActivity.this,MainWebViewActivity.class)); 
} 


public class ImageDownloader extends AsyncTask<String, Void, Bitmap> { 

    @Override 
    protected Bitmap doInBackground(String... urls) { 
     try { 
      URL url = new URL(urls[0]); 
      HttpURLConnection connection = (HttpsURLConnection) url.openConnection(); 
      connection.connect(); 

      InputStream inputStream = connection.getInputStream(); 
      //to convert Image from string data to bitmap 
      Bitmap myBitmap = BitmapFactory.decodeStream(inputStream); 

      return myBitmap; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

答えて

2

あなたは適切AysncTaskクラスを使用しないでください。 get()を呼び出して、イメージがダウンロードされるまでメインスレッドを一時停止します。だから、UIが遅いと感じる理由です。

代わりに、タスクのonPostExecute方法から画像を設定する必要があります。

private Toolbar toolbar; 
private ImageView downloadedImg; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    // ... omitted ... 

    ImageDownloader task = new ImageDownloader();  
    task.execute("https://drive.google.com/uc?id=0B51TujFYa0RBUUYzSE15WHZRR3c"); 

} 

// ... omitted ...  

public class ImageDownloader extends AsyncTask<String, Void, Bitmap> { 

    @Override 
    protected Bitmap doInBackground(String... urls) { 
     try { 
      URL url = new URL(urls[0]); 
      HttpURLConnection connection = (HttpsURLConnection) url.openConnection(); 
      connection.connect(); 

      InputStream inputStream = connection.getInputStream(); 
      //to convert Image from string data to bitmap 
      Bitmap myBitmap = BitmapFactory.decodeStream(inputStream); 

      return myBitmap; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    protected void onPostExecute(Bitmap result) { 

     downloadedImg.setImageBitmap(result); 
    } 
} 
+0

どうもありがとうございました男を、それはとても素晴らしい作品 –

0

これは非同期で行い、メインアクティビティでは実行しません。そうしないと、ダウンロードが完了するまでページがブロックされます。これを行うには多くのオプションがあります。場合は、非同期タスクのドキュメントを見れば、あなたはget()は、以下の記述があることがわかります

Android : Loading an image from the Web with Asynctask

0

待機を:私はこの質問の受け入れ答えに示されている最高のようだと思います計算が完了するのに必要な計算を行い、その結果を取り出す。

代わりのget()を呼び出して、あなたのAsyncTaskのサブクラスでonPostExecuteを実装して、そこに自分の画像を扱う必要があります。アンドロイドの開発者ページにも例があります。

public class ImageDownloader extends AsyncTask<String, Void, Bitmap> { 
    <...> 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     downloadedImg.setImageBitmap(result); 
    } 
} 
関連する問題