آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

بهترین و نرم ترین Thread (حل شد)

علی  11 سال پیش  11 سال پیش
+3 0

لطفا برای این ویو پیجر که بخواد هر چند ثانیه یک بار عکس عوض شه که نرم و خوب رد بشه و از برنامه نزنه بیرون یه Thread بگید.

 

 public class HomeFragment extends Fragment {
	
	public HomeFragment(){}
	
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

       View rootView = inflater.inflate(R.layout.fragment_home, container, false);
       ImageView imgProduct = (ImageView) rootView.findViewById(R.id.imgProduct);
       final PageIndicator indicator = (PageIndicator) rootView.findViewById(R.id.indicator);
       ArrayList<Integer> imageIds = new ArrayList<Integer>();
       ArrayList<String> imageTitles = new ArrayList<String>();
       for (int i = 1; i < 15; i++) {
           int imageId = G.context.getResources().getIdentifier("image" + i, "drawable", G.context.getPackageName());
           imageIds.add(imageId);
           imageTitles.add("Nice Nature #" + i);
       }
       
       indicator.setIndicatorsCount(14);
       
       ViewPager pager = (ViewPager) rootView.findViewById(R.id.pager);
       pager.setOnPageChangeListener(new OnPageChangeListener() {

           @Override
           public void onPageSelected(int index) {}


           @Override
           public void onPageScrolled(int startIndex, float percent, int pixel) {
               indicator.setPercent(percent);
               Log.i("LOG", "Percent: " + startIndex + ", " + percent);
               indicator.setCurrentPage(startIndex);
           }
           
           @Override
           public void onPageScrollStateChanged(int arg0) {

           }
       });

       ImagePagerAdapter adapter = new ImagePagerAdapter(imageIds, imageTitles);
       pager.setAdapter(adapter);
       
       imgProduct.setOnClickListener(new View.OnClickListener() {

           @Override
           public void onClick(View v) {

        	   ProductFragment nextFrag= new ProductFragment();
        	  getFragmentManager().beginTransaction()
        	     .replace(R.id.frame_container, nextFrag)
        	     .addToBackStack(null)
        	     .commit();

           }
           
       });
      
      
           
    return rootView; 

   }

    }

 

+2 0
پیشنهاد میکنم از Handler و متد تاخیر دارش استفاده کنید، هر بار که Runnableـِش اجرا میشه دوباره خودش رو صدا بزنه. (11 سال پیش)
0 0
این خوبه؟ میشه کاملش کنید اینو؟ من با متد Hnadler مشکل دارم کلا. (11 سال پیش)
+2 0
هر چیزی یک جایی داره، استاد Thread رو یاد دادن چون واقعا یادگیریش مهمه، ولی برای کار شما باید از TimerTask استفاده کنید نه Thread . (11 سال پیش)
0 0
من از timer هم استفاده کردم ولی بعد چند بار عوض شدن عکس از برنامه میزنه بیرون. انگاری مموری پر بشه ، یه همچین حالتی. پیش یک استاد هم رفتم ولی نتونست کاری کنه واسم . واقعا دیگه نمی دونم چکار کنم. (11 سال پیش)
+1 0
یکسری اطلاعات لازمه تا بگم مشکل از کجاس، سایز(ابعاد) عکس هاتون چند در چنده؟ و در آداپترتون چجوری عکس هارو ست میکنید؟ اگر سایز رو بگید و کد آداپتر رو اضافه کنید شاید مشکل پیدا بشه. (11 سال پیش)
0 0
سایز عکس ها : 540 * 720 و از آداپتر استاد استفاده کردم . (11 سال پیش)
+1 0
دوست عزیز، مگه مشکل بیرون زدن عکس از Timer و Thread هست؟ پس واسه من که از ویوپیجر استفاده میکنم و داینامیک عکسارو از سرور میخونم و نمایش میدم، چرا نمیزنه بیرون؟ اگه از افکت واسه نرم تر شدن اسلایدها استفاده کردین، احتمالا مشکل از اونجا باشه. البته فقط احتمالا (11 سال پیش)
+1 0
احسان جان مشکل از Timer یا Thread نیست، PagerAdapter فرگمنت ها رو توی رم نگه میداره، همین باعث میشه شما با لود کردن عکس های بعدی به مشکل بخوری، پاسخ های من با توجه به سوال بوده و بعد از توضیحاتی که داده شده پاسخ آخرم رو به عنوان نظر در آخرین پاسخ گفتم.به احتمال زیاد شما از Picasso استفاده کردی که خودش مشکل سایز رو هندل میکنه. (11 سال پیش)
0 0
نه من تیتر سوال و توضیحات آقا علی منظورم بود. من از UniversalImageLoader استفاده میکنم. البته قبل از اینکه از این کتابخونه استفاده کنم هم مشکلی توی نمایش عکس ها نداشتم (11 سال پیش)
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
علی  11 سال پیش
0 0

   private Handler mHandler;
	    public static final int DELAY = 5000;

	    Runnable mRunnable = new Runnable()
	    {

	        @Override
	        public void run()
	        {
	            
		      //TODO: do something like mViewPager.setCurrentPage(mIterator);
	        	
	            mHandler.postDelayed( mRunnable , DELAY );
	        }
	    };
+1 0
یه مثال > لینک (11 سال پیش)
0 0
من اینجوری کد رو نوشتم ولی کار نمیکنه. اشکال از کجاست؟ (11 سال پیش)
پاسخ به سوال 
علی  11 سال پیش
0 0

 public class HomeFragment extends Fragment {
	ViewPager mViewPager;
	private ImagePagerAdapter mImagePagerAdapter;
	public HomeFragment(){}
	
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

       View rootView = inflater.inflate(R.layout.fragment_home, container, false);
       ImageView imgProduct = (ImageView) rootView.findViewById(R.id.imgProduct);
       final PageIndicator indicator = (PageIndicator) rootView.findViewById(R.id.indicator);
       ArrayList<Integer> imageIds = new ArrayList<Integer>();
       ArrayList<String> imageTitles = new ArrayList<String>();
       for (int i = 1; i < 15; i++) {
           int imageId = G.context.getResources().getIdentifier("image" + i, "drawable", G.context.getPackageName());
           imageIds.add(imageId);
           imageTitles.add("Nice Nature #" + i);
       }
       
       indicator.setIndicatorsCount(14);
       
       ViewPager pager = (ViewPager) rootView.findViewById(R.id.pager);
       pager.setOnPageChangeListener(new OnPageChangeListener() {

           @Override
           public void onPageSelected(int index) {}


           @Override
           public void onPageScrolled(int startIndex, float percent, int pixel) {
               indicator.setPercent(percent);
               Log.i("LOG", "Percent: " + startIndex + ", " + percent);
               indicator.setCurrentPage(startIndex);
           }
           
           @Override
           public void onPageScrollStateChanged(int arg0) {

           }
       });

       ImagePagerAdapter adapter = new ImagePagerAdapter(imageIds, imageTitles);
       pager.setAdapter(adapter);
       
       imgProduct.setOnClickListener(new View.OnClickListener() {

           @Override
           public void onClick(View v) {

        	   ProductFragment nextFrag= new ProductFragment();
        	  getFragmentManager().beginTransaction()
        	     .replace(R.id.frame_container, nextFrag)
        	     .addToBackStack(null)
        	     .commit();

           }
           
       });
      
     
           
    return rootView; 

   }
	
	int page = 0;
	Handler handler = new Handler();

	@Override
	public void onCreate(Bundle savedInstanceState) {
	      super.onCreate(savedInstanceState);
	      handler.post(sendData);
	}

	@Override
	public void onDestroy() {
	      super.onDestroy();
	      handler.removeCallbacks(sendData);
	}


	private final Runnable sendData = new Runnable(){
	    public void run(){
	        try {
	            //prepare and send the data here..
	        	if(page >= mImagePagerAdapter.size()) {
	        		page=0;
	        	}else{
	        		mViewPager.setCurrentItem(page++);
	        		
	        	}


	            handler.postDelayed(this, 1000);    
	        }
	        catch (Exception e) {
	            e.printStackTrace();
	        }   
	    }
	};
	
	
	
    }

0 0
تو Logcat داره عوض میشه ولی توی گوشی که نگاه می کنم عوض نمیشه . و البته بعد چند تا عکس که عوض میشه میزنه بیزون از برنامه : OutOfMemoryError . (11 سال پیش)
0 0
لطفا بگید داخل این هندلر چه کار کنم . خیلی واسم مهمه. (11 سال پیش)
پاسخ به سوال 
علی  11 سال پیش
0 0

 public class ImagePagerAdapter extends PagerAdapter {

    public ArrayList<Integer> imageIds;
    public ArrayList<String>  imageTitles;
    


    public ImagePagerAdapter(ArrayList<Integer> imageIds, ArrayList<String> imageTitles) {
        this.imageIds = imageIds;
        this.imageTitles = imageTitles;
    }


    @Override
    public int getCount() {
        return imageIds.size();
    }


    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view.equals(object);
    }


    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View view = G.layoutInflater.inflate(R.layout.sample, null);
        
        ImageView image = (ImageView) view.findViewById(R.id.image);
       
        image.setImageResource(imageIds.get(position));
        container.addView(view);
        return view;
    }


    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }


	public int size() {
		
		return imageIds.size();
	}
    
   
}
0 0
به جای اکستندز از pagerAdapter از FragmentStatePagerAdapter اکستندز کن، به احتمال زیاد مشکلت حل میشه علی جان. (11 سال پیش)
0 0
حاج حسین نشد بازم . حتی در اکتیویتی هم نشد. کلا از ریشه مشکل داره ! اگر سورس فروشی دارین واسه همین لطفا بدید. کلا داستانشم این باشه که از سرور هر چندتا می خوام بخونه و نمایش بده با یه افکت نرم. و اگر اینترنت قطع بود بعد از اولین باری که خوند دانلود کنه و به صورت آفلاین هم بشه دید. کش هم داشته باشه. اگر این کارو واسه من بکنید واقعا ایول دارید. (11 سال پیش)
0 0
شما با همین یکم کار کنید میتونید درستش کنید، قبل از image.setImageResource یکبار image.setImageBitmap ---- null رو قرار بدید شاید درست شد، اررور هنوزم همون OutOfMemmory هست؟ (11 سال پیش)
0 0
حاج حسین کلا به جای TimerTask اومدم از Thread استفاده کردم. فعلا که داره خوب کار میکنه.شما هم یک نگاه بنداز ببین به مشکل نمیخوره وقتی بروم داخل فرگمنت های دیگه؟ (11 سال پیش)
+1 0
سلام دوست عزیز لطفا به این لینک سر بزن شاید مشکلت حل شد لینک (11 سال پیش)
0 0
سلام دوست عزیز این تو اکتیویتی خوبه قبلا گذاشتم ولی برای فرگمنت ها به مشکل خوردم کلا بی خیالش شدم.والا خیلی ساده نوشته .البته تو سایز های بزرگ هم می یومد بیرون از برنامه (11 سال پیش)
0 0
راستی حاج حسین یک چیز عجیب که سر در نمیارم ازش. این Circle ها که با عکس ها عوض میشه استاد طراحی کردند. تو اکتیویتی درسته . داخل فرگمنت هم با شبیه ساز اندروید درسته ولی داخل گوشی اصلا عوض نمیشه. چرا؟ (11 سال پیش)
0 0
اگر منظورتون ProgressBar هست که باید نمایش بده، ترتیب ویو هاتون توی Layout رو چک کنید شاید زیر عکس انداختید، از FrameLayout استفاده کنید برای ProgressBar (11 سال پیش)
0 0
نه منظورم Circle های کوچک هست که چندتا عکس داریم که هر عکسی عوض میشه circle هم عوض میشه .مثلا 3 تا عکس داریم 3تا هم Circle ایجاد میشه و وقتی میریم روی عکس دوم circle هم میره رو دومی. (11 سال پیش)
+1 0
هیچ مشکلی براتون پیش نمیاد، توی تایمر هم باید از Handler استفاده میکردید ولی نتیجه همینه. اینکه توی عکس های بزرگ هم Crash دارید باید فقط 3 فرگمنت رو در رم نگه دارید، با FragmentStatePagerAdapter میتونید این کار رو بکنید. (11 سال پیش)
+1 0
اونارو باید یک ایمیج ویو بالای DrawerLayout توی اکتیویتی بندازی و زمانی که ویو پیجر داره Scroll میشه مقدار X رو بگیری و Circle هاتو جابجا کنی، یکم پیچیده تر از کاریه که استاد کردن ولی روش به همین صورته. (11 سال پیش)
0 0
اها ممنون حاج حسین . روش کار میکنم تا نتیجه بگیرم. ولی خیلی جالبه داخل شبیه ساز اندروید درست کار میکنه. (11 سال پیش)
پاسخ به سوال 
علی  11 سال پیش
0 0

  Thread thread = new Thread(new Runnable() {

           @Override
           public void run() {
               try {
                   while (true) {
                       Thread.sleep(4000);
                       G.HANDLER.post(new Runnable() {

                           @Override
                           public void run() {
                               if (pager.getCurrentItem() >= adapter.getCount() - 1) {
                                   pager.setCurrentItem(0, true);
                               } else {
                                   pager.setCurrentItem(pager.getCurrentItem() + 1, true);
                               }
                           }

                       });
                   }
               }
               catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       });
       thread.start();
       

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .