我的Android应用程序中的UI速度很慢

时间:2016-11-08 16:43:58

标签: android user-interface android-studio android-asynctask

我有一个可以从服务器下载图像的活动 但是应用程序在完成下载图像之前没有加载UI, 我正在使用此代码:

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;
    }
}

3 个答案:

答案 0 :(得分:2)

您未正确使用 AysncTask 类。通过调用get(),您可以暂停主线程,直到下载图像。这就是用户界面感觉缓慢的原因。

相反,您应该从任务的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);
    }
}

答案 1 :(得分:0)

您必须异步执行此操作,而不是在主活动中执行此操作,否则在下载完成之前,页面将被阻止。有很多选择可以做到这一点。我认为在这个问题的接受答案中表示最好:

Android : Loading an image from the Web with Asynctask

答案 2 :(得分:0)

如果您查看异步任务的文档,您会发现get()具有以下描述

  

如果需要等待计算完成,然后检索其结果。

您应该在AsyncTask子类中实现onPostExecute并在那里处理您的图像,而不是调用get()。 Android开发者页面上甚至有一个例子。

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

   @Override
   protected void onPostExecute(Bitmap result) {
      downloadedImg.setImageBitmap(result);
   }
}