0

请看下面的代码。

Activity ac= (Activity)cxt;

    ac.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            load();
        }
    });

这是我正在调用一个函数以从 URL 加载精灵的构造函数。功能如下

private void load()
{

    if(isInternetOn()){
        try {
            ITexture mTexture = new BitmapTexture(mEngine.getTextureManager(), new IInputStreamOpener() {
                @Override
                public InputStream open() throws IOException {

                    URL url = new URL("http://tenlogix.com/cupcakemania/Ads/burgermaker.png");

                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setDoInput(true);
                    connection.connect();
                    InputStream input = connection.getInputStream();
                    BufferedInputStream in = new BufferedInputStream(input);    
                    return in;
                }
            });
            mTexture.load();
            MyImageFromWeb = TextureRegionFactory.extractFromTexture(mTexture);



        } catch (IOException e) {
            Log.d("TenlogixAds"," "+e);
        }

        AdSprite = new Sprite(0, 0, MyImageFromWeb, mEngine.getVertexBufferObjectManager());
    }
    else{
        Log.d("TenlogixAds"," No Internet Connection Detected.. ");
        AdSprite = null;
    }

}

问题是,如果我现在在 UI 线程中调用加载函数,图像会被加载,但当我在 UI 线程中调用它时它没有加载。

在 UI 线程中调用它很重要,因为我想要执行此任务是后台任务,这会导致游戏运行出现问题。

我也尝试过 AsyncTask,但我用 UI Thread 描述的问题与 Async Task 相同。

任何人都可以帮我解决这个问题吗?

我想从网络加载图像,并且我希望它在后台加载,从而导致任何延迟或游戏正在播放的问题。

4

3 回答 3

3

目前您正在调用 load(); UI 线程上的方法会冻结 UI 线程,直到网络操作未完成。要在后台线程中获取图像,您需要调用 load(); 除了runOnUiThread

    new Thread(new Runnable() {

       @Override
       public void run() {
         // call  load() method here
           load();
          ac.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // update image here without interrupting user
                  .....
            }
        });
      }
}).start();
于 2013-05-20T07:38:24.223 回答
1

可以使用 Async Task 也可以调试值 mTexture 不为空。

public void loadImageFromServer() {

    final IAsyncCallback callback = new IAsyncCallback() {

        @Override
        public void workToDo() {
            Log.e("BaseActivity", "OnWhat to do working");
            if (isInternetOn()) {
                try {
                    ITexture mTexture = new BitmapTexture(
                            mEngine.getTextureManager(),
                            new IInputStreamOpener() {
                                @Override
                                public InputStream open()
                                        throws IOException {

                                    URL url = new URL(
                                            "http://tenlogix.com/cupcakemania/Ads/burgermaker.png");

                                    HttpURLConnection connection = (HttpURLConnection) url
                                            .openConnection();
                                    connection.setDoInput(true);
                                    connection.connect();
                                    InputStream input = connection
                                            .getInputStream();
                                    BufferedInputStream in = new BufferedInputStream(
                                            input);
                                    return in;
                                }
                            });
                    if (mTexture != null) {
                        mTexture.load();

                        MyImageFromWeb = TextureRegionFactory
                                .extractFromTexture(mTexture);
                    }

                } catch (IOException e) {
                    Log.d("TenlogixAds", " " + e);
                }

            } else {
                Log.d("TenlogixAds", " No Internet Connection Detected.. ");
                AdSprite = null;
            }

        }

        @Override
        public void onComplete() {
            // can create after Initializing MyImageFromWeb

            if (MyImageFromWeb != null) {

                AdSprite = new Sprite(0, 0, MyImageFromWeb,
                        mEngine.getVertexBufferObjectManager());
            }

        }

    };

    aBaseActivity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            new AsyncTaskLoader().execute(callback);
        }
    });

}

IAsyncCallback是一个接口。好像:

    public interface IAsyncCallback {
    // ===========================================================
    // Methods
    // ===========================================================
    public abstract void workToDo();

    public abstract void onComplete();

}

我的AsyncTaskLoader类是这样的:

import android.os.AsyncTask;

public class AsyncTaskLoader extends
        AsyncTask<IAsyncCallback, Integer, Boolean> {
    // ===========================================================
    // Fields
    // ===========================================================
    IAsyncCallback[] _params;

    // ===========================================================
    // Inherited Methods
    // ===========================================================
    @Override
    protected Boolean doInBackground(IAsyncCallback... params) {
        this._params = params;
        int count = params.length;
        for (int i = 0; i < count; i++) {
            params[i].workToDo();
        }
        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        int count = this._params.length;
        for (int i = 0; i < count; i++) {
            this._params[i].onComplete();
        }
    }
}
于 2013-05-20T09:00:53.207 回答
0

我不是Andengine的专业人士。希望我能帮助你:D

我在使用在线资源之前编写了一些应用程序,将首先使用 android 中的缓存存储方法缓存文件。

您可以将文件保存到 Conetext.getCacheDir() 中,系统会在应用程序卸载后自动释放内存。

公共抽象文件 getCacheDir()

更多的信息。使用 HttpURLConnection 下载图片 你可以使用 fileoutputStream 来保存图片

    FileOutputStream fos = new FileOutputStream(new File(Context.getCacheDir() + "/my_image.png"));
    fos.write(.....);
    fos.flush();

然后您可以正常使用来自 Context.getCacheDir() + "/my_image.png" 的图像

于 2013-05-20T07:38:49.137 回答