gpt4 book ai didi

java - 加载位图时应用程序 UI 变得无响应

转载 作者:行者123 更新时间:2023-12-01 14:43:04 25 4
gpt4 key购买 nike

我有一个 CountDownTimer,它每 15 秒调用一次 ChangeWallpaper() 方法。壁纸按其应有的方式更改,但当我尝试打开应用程序时,它使应用程序抽屉屏幕几秒钟没有响应。当应用程序最终打开时,我选择的所有内容都需要 5-10 秒才能响应。我在 Android Developer 中读到过有关 AsyncTask 的内容,它应该在 UI 线程之外加载位图并防止应用程序挂起,但它似乎不起作用。

以下代码位于我的 Activity 类中:

/** changeWallpaper() **/ - called by CountDownTimer every 15 seconds
protected void changeWallpaper() throws IOException {
Integer totalimages = finallist.size();

if (lastloopcount == totalimages) { // if end of the list of images is reached, it resets and goes back to top.
loopcount = 0;
lastloopcount = 0;
}

for (String imagepath : finallist) { // "finallist" is global variable with all the image's paths in an array list. The Loop count is to select the next image in the array list every 15 seconds.
loopcount++;
if (loopcount > lastloopcount) {
lastloopcount = loopcount;
loopcount = 0;

WallpaperManager wm = WallpaperManager.getInstance(this);
wm.setBitmap(decodeImageFromPath(imagepath));

break;
}
}
}

/** AsyncTask Wallpaper Load **/
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
public BitmapWorkerTask(ImageView imageView) {
new WeakReference<ImageView>(imageView);
}

@Override
protected Bitmap doInBackground(Integer... params) {
return null;
}
}

/** decodeImageFromPath() **/
public Bitmap decodeImageFromPath(String imagepath) {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels << 2;

// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imagepath, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, width, height);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(imagepath, options);
}

/** WallpaperManager (Method) **/
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// ... Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;

int stretch_width = Math.round((float)width / (float)reqWidth);
int stretch_height = Math.round((float)height / (float)reqHeight);

if (stretch_width <= stretch_height) return stretch_height;
else return stretch_width;
}
  1. 我是否正确使用了 AsyncTask 函数?
  2. 有更简单的写法吗?

提前致谢。

编辑:

/** Spinner **/
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String chosenTime = parent.getItemAtPosition(position).toString();
int chosenTimeNew = 0;
if (chosenTime.contains("sec")) {
chosenTime = chosenTime.replace(" sec","");
chosenTimeNew = Integer.parseInt(chosenTime) * 500;
} else if (chosenTime.contains("min") ) {
chosenTime = chosenTime.replace(" min","");
chosenTimeNew = Integer.parseInt(chosenTime) * 30000;
} else if (chosenTime.contains("hour")) {
chosenTime = chosenTime.replace(" hour","");
chosenTimeNew = (Integer.parseInt(chosenTime) * 30000) * 60;
} else if (chosenTime.contains("day")) {
chosenTime = chosenTime.replace(" day","");
chosenTimeNew = ((Integer.parseInt(chosenTime) * 30000) * 60) * 24;
}
rSpeed = chosenTimeNew;
}

编辑2:

由 CountDownTimer() 调用:

new BitmapWorkerTask(null).execute(imagepath);

然后:

    /** AsyncTask Wallpaper Load **/
class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> {

public BitmapWorkerTask(ImageView imageView) {
new WeakReference<ImageView>(imageView);
}

@Override
protected Bitmap doInBackground(String... params) {

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels << 2;

// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(params[0], options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, width, height);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;

Bitmap bmp = BitmapFactory.decodeFile(params[0], options);
return bmp;
}

protected void onPostExecute(Bitmap bmp) {

Context context = getApplicationContext();
WallpaperManager wm = WallpaperManager.getInstance(context);
try {
wm.setBitmap(bmp);
} catch (IOException e) {
e.printStackTrace();
}
}
}

/** WallpaperManager (Method) **/
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// ... Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;

int stretch_width = Math.round((float)width / (float)reqWidth);
int stretch_height = Math.round((float)height / (float)reqHeight);

if (stretch_width <= stretch_height) return stretch_height;
else return stretch_width;
}

最佳答案

您的主要代码(处理位图)应该从 doInBackground 方法中调用。否则与这里的同步调用相同。

    @Override    protected Bitmap doInBackground(String... params) {        Bitmap bmp = decodeImageFromPath(params[0]);        return bmp;    }     protected void onPostExecute(Bitmap bmp) {        wm.setBitmap(bmp)     }
new BitmapWorkerTask ().execute(imagePath);

http://developer.android.com/reference/android/os/AsyncTask.html

您可以引用此链接上的示例。

关于java - 加载位图时应用程序 UI 变得无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15747794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com