Android 使用Viewpager强制关闭

Android 使用Viewpager强制关闭,android,Android,我正在开发一个应用程序,从服务器检索图像并将其存储在SD卡中。 我将图像的路径存储在本地数据库中,然后在使用viewpager显示图像时使用它们。 当只有两个图像时,一切正常,但当有两个以上的图像时,应用程序停止,并在图像之间滑动时发生。当我滑动两次以上时,应用程序立即停止 class RequestLoadingMeals extends AsyncTask <Void, Void, Void> { protected void onPreExecute(){

我正在开发一个应用程序,从服务器检索图像并将其存储在SD卡中。 我将图像的路径存储在本地数据库中,然后在使用viewpager显示图像时使用它们。 当只有两个图像时,一切正常,但当有两个以上的图像时,应用程序停止,并在图像之间滑动时发生。当我滑动两次以上时,应用程序立即停止

class RequestLoadingMeals extends AsyncTask <Void, Void, Void> {
     protected void onPreExecute(){
          super.onPreExecute();
          PD = new ProgressDialog(Meals.this);
          PD.setMessage("Loading Meals, Please wait...");
          PD.setIndeterminate(false);
          PD.setCancelable(true);
          PD.setProgressStyle(ProgressDialog.STYLE_SPINNER);
          PD.show();
     }

    @Override
    protected Void doInBackground(Void... arg0) {
        // TODO Auto-generated method stub

        myDatabaseHandler.openToRead();
        Cursor meals_cursor = myDatabaseHandler.queueSomeMeals(rest_name);
        if (meals_cursor.moveToFirst())
          {
             do 
             {
                 try{
                 images.add(meals_cursor.getString(meals_cursor.getColumnIndex(DatabaseHandler.KEY_MEAL_IMAGE_PATH)));
                 } catch (Exception h){ 
                 }
             }while (meals_cursor.moveToNext());
          }
        myDatabaseHandler.close();
        return null;
    }
    protected void onPostExecute(final Void x) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(Meals.this, images);
        ViewPager myPager = (ViewPager) findViewById(R.id.mypager);
        myPager.setAdapter(adapter);
        myPager.setCurrentItem(0);
        PD.dismiss();
    }
}

将此项添加到您的
视图PageRadapter

@Override
public void destroyItem(View collection, int position, Object view) {
     ((ViewPager) collection).removeView((View) view);
}

我建议不要在
实例化项中执行繁重的长时间运行任务。在UI线程上解码图像是个坏主意

洛格特求你了!bw看起来您的内存不足,位图越来越多。在这种情况下,你应该使用一个好的图像加载程序库来加载图像。我正在我的手机上测试这个应用程序,因为emulator在尝试将图像存储到SD卡时给了我一个错误,所以我无法发布日志。但我认为这不是内存不足的问题,我尝试了两张图像,效果很好,当我尝试3张图像时,效果不好,当我滑到第三张图像时,应用程序在加载后停止,我尝试只滑到第二张图像,然后再滑回第一张图像,问题也发生了。您是否为模拟器分配了sd卡内存?编辑您的模拟器或创建一个新的模拟器,并为sd卡分配一些内存。它应该会起作用。这样你就可以看到logcat,调试起来就容易多了。我添加了logcat,你现在可以查看了。下面的@M-WaJeEh已经回答了。希望它能起作用。谢谢,它现在起作用了。但请告诉我如何避免实例化项中繁重的长时间运行任务。我考虑使用asynctask在后台解码图像,并将这些位图存储在位图的Arraylist中,然后在postExecute中显示它们,您的看法是什么?如果您继续将它们存储在
Arraylist
中,最终会出现内存不足错误。我强烈建议你使用毕加索,然后它会为你做所有的工作(内存缓存,SD卡缓存)等等。你需要的是这种类型的单线
Picasso.with(context.load)(新文件(“/images/oprah_bees.gif”))。进入(imageView)
实例化Item()
中。
12-02 12:46:38.956: E/AndroidRuntime(431): FATAL EXCEPTION: main
12-02 12:46:38.956: E/AndroidRuntime(431):java.lang.UnsupportedOperationException:Required method destroyItem was not overridden
12-02 12:46:38.956: E/AndroidRuntime(431):  at android.support.v4.view.PagerAdapter.destroyItem(PagerAdapter.java:192)
12-02 12:46:38.956: E/AndroidRuntime(431):  at android.support.v4.view.PagerAdapter.destroyItem(PagerAdapter.java:124)
12-02 12:46:38.956: E/AndroidRuntime(431):  at android.support.v4.view.ViewPager.populate(ViewPager.java:1036)
12-02 12:46:38.956: E/AndroidRuntime(431):  at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
12-02 12:46:38.956: E/AndroidRuntime(431):  at android.support.v4.view.ViewPager$3.run(ViewPager.java:244)
12-02 12:46:38.956: E/AndroidRuntime(431):  at android.os.Handler.handleCallback(Handler.java:587)
12-02 12:46:38.956: E/AndroidRuntime(431):  at android.os.Handler.dispatchMessage(Handler.java:92)
12-02 12:46:38.956: E/AndroidRuntime(431):  at android.os.Looper.loop(Looper.java:123)
12-02 12:46:38.956: E/AndroidRuntime(431):  at android.app.ActivityThread.main(ActivityThread.java:3683)
12-02 12:46:38.956: E/AndroidRuntime(431):  at java.lang.reflect.Method.invokeNative(Native Method)
12-02 12:46:38.956: E/AndroidRuntime(431):  at java.lang.reflect.Method.invoke(Method.java:507)
12-02 12:46:38.956: E/AndroidRuntime(431):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-02 12:46:38.956: E/AndroidRuntime(431):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-02 12:46:38.956: E/AndroidRuntime(431):  at dalvik.system.NativeStart.main(Native Method)
@Override
public void destroyItem(View collection, int position, Object view) {
     ((ViewPager) collection).removeView((View) view);
}