Asynctask 崩溃 ViewPager RecyclerView (Android)
Posted
技术标签:
【中文标题】Asynctask 崩溃 ViewPager RecyclerView (Android)【英文标题】:Asynctask crash ViewPager RecyclerView (Android) 【发布时间】:2019-03-20 16:54:56 【问题描述】:目前,我正在做一个 android 项目,我在其中实现了底部导航视图和滑动效果,我可以在其中左右交换片段。它们是同步的。
很遗憾,我有 2 个错误,我无法解决。
-
当我滑动时,Asynctask 崩溃。我收到以下错误:
E/MessageQueue-JNI:java.lang.IllegalStateException:无法执行任务:任务已经在运行。
这是因为 Asynctask 已在运行时被调用?
我想我必须在运行 Asynctask 之前取消它,但我该怎么做呢?
-
我有 5 个片段开始,您可以在我的底部导航视图中看到这些片段。它们还可以通过在屏幕上左右滑动来改变。在导航栏上的第二个项目上,我有一个 Cardview,它是用 recyclerViewAdapter 实现的。每当我单击其中一个卡片视图时,它都应该更改为新片段。导航视图中未显示的片段。在 recyclerViewAdapter Java 类中有一个 onClick,每当我点击其中一个卡片视图时,它都会更改片段,但由于某种原因,它不起作用。
图片在这里:
* 代码在这里 *
主活动:
@Override
public void onBackPressed()
if (mPager.getCurrentItem() == 0)
// If the user is currently looking at the first step, allow the system to handle the
// Back button. This calls finish() on this activity and pops the back stack.
super.onBackPressed();
else
// Otherwise, select the previous step.
mPager.setCurrentItem(mPager.getCurrentItem() - 1);
/**
* view pager.
*/
public void setupViewPager(ViewPager viewPager)
ViewPageAdapter adapter = new ViewPageAdapter(getSupportFragmentManager());
adapter.addFragment(new StartsideFragment());
adapter.addFragment(new CardViewTabelFragment());
adapter.addFragment(new SensorOversigtFragment());
adapter.addFragment(new KontaktFragment());
viewPager.setAdapter(adapter);
public void setViewPager(int fragmentNumber)
mPager.setCurrentItem(fragmentNumber);
public void enableViewPagerSwitch()
mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener()
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
@Override
public void onPageSelected(int position)
if (prevMenuItem != null)
prevMenuItem.setChecked(false);
else
mBottomNav.getMenu().getItem(0).setChecked(false);
Log.d("page", "onPageSelected: "+position);
mBottomNav.getMenu().getItem(position).setChecked(true);
prevMenuItem = mBottomNav.getMenu().getItem(position);
@Override
public void onPageScrollStateChanged(int state)
);
setupViewPager( mPager );
public void bot_Navigation()
mBottomNav = (BottomNavigationView) findViewById( R.id.nav_bot );
botNavHelper.disableShiftMode( mBottomNav );
mBottomNav.setOnNavigationItemSelectedListener( new BottomNavigationView.OnNavigationItemSelectedListener()
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item)
switch (item.getItemId())
case R.id.bot_startside:
// overridePendingTransition( R.anim.slide_in_right, R.anim.slide_out_left );
//mPager.setCurrentItem( 0 );
setViewPager( 0 );
//fragment = new StartsideFragment();
break;
case R.id.bot_datatabel:
//overridePendingTransition( R.anim.slide_in_right, R.anim.slide_out_left );
//mPager.setCurrentItem( 1 );
setViewPager( 1 );
//fragment = new CardViewTabelFragment();
//viewPager.setCurrentItem( 1 );
break;
case R.id.bot_sensorOversigt:
//overridePendingTransition( R.anim.slide_in_right, R.anim.slide_out_left );
//mPager.setCurrentItem( 2 );
setViewPager( 2 );
//fragment = new KontaktFragment();
break;
case R.id.bot_kontakt:
//overridePendingTransition( R.anim.slide_in_right, R.anim.slide_out_left );
//mPager.setCurrentItem( 3 );
setViewPager( 3 );
//fragment = new SensorOversigtFragment();
break;
case R.id.bot_logUd:
//overridePendingTransition( R.anim.slide_in_right, R.anim.slide_out_left );
//mPager.setCurrentItem( 4 );
setViewPager( 4 );
alertDialog();
break;
if (fragment != null)
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, fragment );
ft.commit();
return true;
);
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate( savedInstanceState );
onCreate2();
bot_Navigation();
protected void onCreate2()
// protected void onCreate2(Bundle savedInstanceState)
// super.onCreate(savedInstanceState);
setContentView( R.layout.activity_main );
Toolbar toolbar = (Toolbar) findViewById( R.id.toolbar );
setSupportActionBar( toolbar );
//toolbar.setLogo( R.mipmap.ic_launcher_cxweb_black );
TextView mTitle = (TextView) toolbar.findViewById( R.id.toolbartitle );
mTitle.setText( toolbar.getTitle() );
getSupportActionBar().setDisplayShowTitleEnabled( false );
//toolbar.setTitle( "LeoSenses" );
mPager = (ViewPager) findViewById( R.id.flMain );
enableViewPagerSwitch();
DrawerLayout drawer = (DrawerLayout) findViewById( R.id.drawer_layout );
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close );
drawer.addDrawerListener( toggle );
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById( R.id.nav_view );
navigationView.setNavigationItemSelectedListener( this );
//Default fragment for startside
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new StartsideFragment() );
ft.commit();
navigationView.setCheckedItem( R.id.nav_startside );
PreferenceManager.getDefaultSharedPreferences( this ).getBoolean( "brugPosVedStart", true );
ViewPageAdapter:
public class ViewPageAdapter extends FragmentStatePagerAdapter
private final List<Fragment> mFragmentList = new ArrayList<>();
public ViewPageAdapter(FragmentManager fm)
super( fm );
public void addFragment(Fragment fragment)
mFragmentList.add( fragment );
@Override
public Fragment getItem(int position)
return mFragmentList.get( position );
@Override
public int getCount()
return mFragmentList.size();
RecyclerViewAdapter:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder>
private ViewPager mPager;
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
View view = LayoutInflater.from( viewGroup.getContext() ).inflate( R.layout.fragment_card_view_tabel, viewGroup, false );
viewGroup.setOnClickListener( new View.OnClickListener()
@Override
public void onClick(View view)
);
return new RecyclerViewHolder( view );
@Override
public void onBindViewHolder(RecyclerViewHolder recyclerViewHolder, int i)
recyclerViewHolder.mBeskrivelse.setText( OurData.beskrivelse[i] );
recyclerViewHolder.mTitle.setText( OurData.title[i] );
recyclerViewHolder.cardView.setCardBackgroundColor( Color.parseColor( OurData.colors[i] ) );
@Override
public int getItemCount()
return OurData.title.length;
class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
public int nummer;
private TextView mBeskrivelse;
private TextView mTitle;
private CardView cardView;
public RecyclerViewHolder(View itemView)
super( itemView );
mPager = (ViewPager) itemView.findViewById( R.id.flMain );
mBeskrivelse = (TextView) itemView.findViewById( R.id.item_beskrivelse );
mTitle = (TextView) itemView.findViewById( R.id.item_title );
cardView = (CardView) itemView.findViewById( R.id.card_view );
itemView.setOnClickListener( this );
@Override
public void onClick(View v)
nummer = getAdapterPosition();
if (nummer == 0)
//mPager.setCurrentItem(0);
((FragmentActivity) itemView.getContext()).getSupportFragmentManager().beginTransaction().replace( R.id.flMain, new DataTabelFragment() ).commit();
else if (nummer == 1)
((FragmentActivity) itemView.getContext()).getSupportFragmentManager().beginTransaction().replace( R.id.flMain, new Sensor1Fragment() ).commit();
else if (nummer == 2)
((FragmentActivity) itemView.getContext()).getSupportFragmentManager().beginTransaction().replace( R.id.flMain, new Sensor2Fragment() ).commit();
else if (nummer == 3)
((FragmentActivity) itemView.getContext()).getSupportFragmentManager().beginTransaction().replace( R.id.flMain, new Sensor3Fragment() ).commit();
带有异步任务的片段之一:
public class DataTabelFragment extends Fragment implements jsonAsynctask.DataTabelFragment
public TextView sensor1;
jsonAsynctask jsonasynctask = new jsonAsynctask( this );
public DataTabelFragment()
// Required empty public constructor
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
// Inflate the layout for this fragment
View view = inflater.inflate( R.layout.fragment_data_tabel, container, false );
sensor1 = (TextView) view.findViewById( R.id.sensorAlleBox );
jsonasynctask.execute();
return view;
@Override
public void onJobFinishListener(List<String> allId)
//when this method is trigered by your asynctask
//it means that you are in ui thread and update your ui component
for (int i = 0; i < allId.size(); i++)
sensor1.append( jsonasynctask.allId.get( i ) + " | " + jsonasynctask.allDevice.get( i ) + " | " + jsonasynctask.allTemp.get( i ) + " | " + jsonasynctask.allHum.get( i ) + " | " + jsonasynctask.allBat.get( i ) + " | " + jsonasynctask.allMode.get( i ) + " | " + jsonasynctask.allLux.get( i ) + " | " + jsonasynctask.allDate_time.get( i ) + "\n\n" );
* 更新 *
ASYNCTASK 发生错误的片段:
public class SensorOversigtFragment extends Fragment implements jsonAsynctask.DataTabelFragment
private TextView firstValue;
private TextView firstValue2;
private TextView firstDevice;
private TextView secondValue;
private TextView secondDevice;
private TextView secondValue2;
private ImageView firstImage, secondImage;
private View firstView, secondView;
private LinearLayout linear1, linear2;
jsonAsynctask jsonasynctask = new jsonAsynctask( this );
public SensorOversigtFragment()
// Required empty public constructor
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
// Inflate the layout for this fragment
View view = inflater.inflate( R.layout.content_sensor_oversigt, container, false );
firstValue = (TextView) view.findViewById( R.id.firstValue );
firstDevice = (TextView) view.findViewById( R.id.firstDevice );
firstValue2 = (TextView) view.findViewById( R.id.firstValue2 );
secondDevice = (TextView) view.findViewById( R.id.secondDevice );
secondValue = (TextView) view.findViewById( R.id.secondValue );
secondValue2 = (TextView) view.findViewById( R.id.secondValue2 );
linear1 = (LinearLayout) view.findViewById( R.id.linear1 );
linear2 = (LinearLayout) view.findViewById( R.id.linear2 );
firstImage = (ImageView) view.findViewById( R.id.firstImage );
secondImage = (ImageView) view.findViewById( R.id.secondImage );
firstView = (View) view.findViewById( R.id.firstView );
secondView = (View) view.findViewById( R.id.secondView );
if (jsonasynctask.getStatus() == AsyncTask.Status.RUNNING)
jsonasynctask.cancel( true );
else if (jsonasynctask.getStatus() != AsyncTask.Status.RUNNING)
jsonasynctask.execute();
return view;
@Override
public void onJobFinishListener(List<String> allId)
//System.out.println( "LAST MODE: " + jsonasynctask.allMode.get( allId.size() - 1 ) );
for (int i = 0; i < allId.size(); i++)
if (jsonasynctask.allDevice.get( i ).equals( "B42DB2" ))
if (jsonasynctask.allMode.get( i ).equals( "0" ))
linear1.setBackgroundColor( Color.parseColor( "#A9A9A9" ) );
firstDevice.setBackgroundColor( Color.parseColor( "#808080" ) );
firstDevice.setText( "STANDBY MODE" );
firstValue.setVisibility( View.GONE );
firstValue2.setVisibility( View.GONE );
firstImage.setColorFilter( Color.parseColor( "#A9A9A9" ) );
firstView.setBackgroundColor( Color.parseColor( "#A9A9A9" ) );
else if (jsonasynctask.allMode.get( i ).equals( "1" ))
linear1.setBackgroundColor( Color.parseColor( "#A0D468" ) );
firstValue.setBackgroundColor( Color.parseColor( "#8CC152" ) );
firstValue2.setBackgroundColor( Color.parseColor( "#8CC152" ) );
firstDevice.setBackgroundColor( Color.parseColor( "#8CC152" ) );
firstView.setBackgroundColor( Color.parseColor( "#A0D468" ) );
firstImage.setImageResource( R.drawable.lighticon );
firstValue.setText( jsonasynctask.allTemp.get( i ) + "°C" );
firstValue2.setText( jsonasynctask.allHum.get( i ) + "%" );
firstDevice.setText( jsonasynctask.allDevice.get( i ) );
firstValue.setVisibility( View.VISIBLE );
firstValue2.setVisibility( View.VISIBLE );
firstImage.setColorFilter( Color.parseColor( "#FFFFFF" ) );
else if (jsonasynctask.allMode.get( i ).equals( "2" ))
linear1.setBackgroundColor( Color.parseColor( "#FFCE54" ) );
firstValue.setBackgroundColor( Color.parseColor( "#F68B42" ) );
firstValue2.setBackgroundColor( Color.parseColor( "#F68B42" ) );
firstDevice.setBackgroundColor( Color.parseColor( "#F68B42" ) );
firstView.setBackgroundColor( Color.parseColor( "#FFCE54" ) );
firstImage.setImageResource( R.drawable.light_bulb_7_512 );
firstValue.setText( jsonasynctask.allLux.get( i ) );
firstValue2.setText( "Lux" );
firstDevice.setText( jsonasynctask.allDevice.get( i ) );
firstValue.setVisibility( View.VISIBLE );
firstValue2.setVisibility( View.VISIBLE );
firstImage.setColorFilter( Color.parseColor( "#FFFFFF" ) );
else if (jsonasynctask.allMode.get( i ).equals( "3" ))
linear1.setBackgroundColor( Color.parseColor( "#4FC1E9" ) );
firstValue.setBackgroundColor( Color.parseColor( "#3BAFDA" ) );
firstValue2.setBackgroundColor( Color.parseColor( "#3BAFDA" ) );
firstDevice.setBackgroundColor( Color.parseColor( "#3BAFDA" ) );
firstView.setBackgroundColor( Color.parseColor( "#4FC1E9" ) );
firstImage.setImageResource( R.drawable.ic_baseline_meeting_room_24px );
firstValue.setText( jsonasynctask.allDoor.get( i ) );
firstValue2.setText( "Door" );
firstDevice.setText( jsonasynctask.allDevice.get( i ) );
firstValue.setVisibility( View.VISIBLE );
firstValue2.setVisibility( View.VISIBLE );
firstImage.setColorFilter( Color.parseColor( "#FFFFFF" ) );
else if (jsonasynctask.allMode.get( i ).equals( "4" ))
linear1.setBackgroundColor( Color.parseColor( "#509CEC" ) );
firstValue.setBackgroundColor( Color.parseColor( "#4A89DC" ) );
firstValue2.setBackgroundColor( Color.parseColor( "#4A89DC" ) );
firstDevice.setBackgroundColor( Color.parseColor( "#4A89DC" ) );
firstView.setBackgroundColor( Color.parseColor( "#509CEC" ) );
firstImage.setImageResource( R.drawable.vibration );
firstValue.setText( jsonasynctask.allVib.get( i ) );
firstValue2.setText( "Vib" );
firstDevice.setText( jsonasynctask.allDevice.get( i ) );
firstValue.setVisibility( View.VISIBLE );
firstValue2.setVisibility( View.VISIBLE );
firstImage.setColorFilter( Color.parseColor( "#FFFFFF" ) );
else if (jsonasynctask.allMode.get( i ).equals( "5" ))
linear1.setBackgroundColor( Color.parseColor( "#EC87C0" ) );
firstValue.setBackgroundColor( Color.parseColor( "#D770AD" ) );
firstValue2.setBackgroundColor( Color.parseColor( "#D770AD" ) );
firstDevice.setBackgroundColor( Color.parseColor( "#D770AD" ) );
firstView.setBackgroundColor( Color.parseColor( "#EC87C0" ) );
firstImage.setImageResource( R.drawable.ic_magnet );
firstValue.setText( jsonasynctask.allMag.get( i ) );
firstValue2.setText( "Mag" );
firstDevice.setText( jsonasynctask.allDevice.get( i ) );
firstValue.setVisibility( View.VISIBLE );
firstValue2.setVisibility( View.VISIBLE );
firstImage.setColorFilter( Color.parseColor( "#FFFFFF" ) );
else if (jsonasynctask.allDevice.get( i ).equals( "B42DC6" ))
if (jsonasynctask.allMode.get( i ).equals( "0" ))
linear2.setBackgroundColor( Color.parseColor( "#A9A9A9" ) );
secondDevice.setBackgroundColor( Color.parseColor( "#808080" ) );
secondDevice.setText( "STANDBY MODE" );
secondValue.setVisibility( View.GONE );
secondValue2.setVisibility( View.GONE );
secondImage.setColorFilter( Color.parseColor( "#A9A9A9" ) );
secondView.setBackgroundColor( Color.parseColor( "#A9A9A9" ) );
else if (jsonasynctask.allMode.get( i ).equals( "1" ))
linear2.setBackgroundColor( Color.parseColor( "#A0D468" ) );
secondValue.setBackgroundColor( Color.parseColor( "#8CC152" ) );
secondValue2.setBackgroundColor( Color.parseColor( "#8CC152" ) );
secondDevice.setBackgroundColor( Color.parseColor( "#8CC152" ) );
secondView.setBackgroundColor( Color.parseColor( "#A0D468" ) );
secondImage.setImageResource( R.drawable.lighticon );
secondValue.setText( jsonasynctask.allTemp.get( i ) + "°C" );
secondValue2.setText( jsonasynctask.allHum.get( i ) + "%" );
secondDevice.setText( jsonasynctask.allDevice.get( i ) );
secondValue.setVisibility( View.VISIBLE );
secondValue2.setVisibility( View.VISIBLE );
secondImage.setColorFilter( Color.parseColor( "#FFFFFF" ) );
else if (jsonasynctask.allMode.get( i ).equals( "2" ))
linear2.setBackgroundColor( Color.parseColor( "#FFCE54" ) );
secondValue.setBackgroundColor( Color.parseColor( "#F68B42" ) );
secondValue2.setBackgroundColor( Color.parseColor( "#F68B42" ) );
secondDevice.setBackgroundColor( Color.parseColor( "#F68B42" ) );
secondView.setBackgroundColor( Color.parseColor( "#FFCE54" ) );
secondImage.setImageResource( R.drawable.light_bulb_7_512 );
secondValue.setText( jsonasynctask.allLux.get( i ) );
secondValue2.setText( "Lux" );
secondDevice.setText( jsonasynctask.allDevice.get( i ) );
secondValue.setVisibility( View.VISIBLE );
secondValue2.setVisibility( View.VISIBLE );
secondImage.setColorFilter( Color.parseColor( "#FFFFFF" ) );
else if (jsonasynctask.allMode.get( i ).equals( "3" ))
linear2.setBackgroundColor( Color.parseColor( "#4FC1E9" ) );
secondValue.setBackgroundColor( Color.parseColor( "#3BAFDA" ) );
secondValue2.setBackgroundColor( Color.parseColor( "#3BAFDA" ) );
secondDevice.setBackgroundColor( Color.parseColor( "#3BAFDA" ) );
secondView.setBackgroundColor( Color.parseColor( "#4FC1E9" ) );
secondImage.setImageResource( R.drawable.ic_baseline_meeting_room_24px );
secondValue.setText( jsonasynctask.allDoor.get( i ) );
secondValue2.setText( "Door" );
secondDevice.setText( jsonasynctask.allDevice.get( i ) );
secondValue.setVisibility( View.VISIBLE );
secondValue2.setVisibility( View.VISIBLE );
secondImage.setColorFilter( Color.parseColor( "#FFFFFF" ) );
else if (jsonasynctask.allMode.get( i ).equals( "4" ))
linear2.setBackgroundColor( Color.parseColor( "#509CEC" ) );
secondValue.setBackgroundColor( Color.parseColor( "#4A89DC" ) );
secondValue2.setBackgroundColor( Color.parseColor( "#4A89DC" ) );
secondDevice.setBackgroundColor( Color.parseColor( "#4A89DC" ) );
secondView.setBackgroundColor( Color.parseColor( "#509CEC" ) );
secondImage.setImageResource( R.drawable.vibration );
secondValue.setText( jsonasynctask.allVib.get( i ) );
secondValue2.setText( "Vib" );
secondDevice.setText( jsonasynctask.allDevice.get( i ) );
secondValue.setVisibility( View.VISIBLE );
secondValue2.setVisibility( View.VISIBLE );
secondImage.setColorFilter( Color.parseColor( "#FFFFFF" ) );
else if (jsonasynctask.allMode.get( i ).equals( "5" ))
linear2.setBackgroundColor( Color.parseColor( "#EC87C0" ) );
secondValue.setBackgroundColor( Color.parseColor( "#D770AD" ) );
secondValue2.setBackgroundColor( Color.parseColor( "#D770AD" ) );
secondDevice.setBackgroundColor( Color.parseColor( "#D770AD" ) );
secondView.setBackgroundColor( Color.parseColor( "#EC87C0" ) );
secondImage.setImageResource( R.drawable.ic_magnet );
secondValue.setText( jsonasynctask.allMag.get( i ) );
secondValue2.setText( "Mag" );
secondDevice.setText( jsonasynctask.allDevice.get( i ) );
secondValue.setVisibility( View.VISIBLE );
secondValue2.setVisibility( View.VISIBLE );
secondImage.setColorFilter( Color.parseColor( "#FFFFFF" ) );
【问题讨论】:
***.com/questions/23172042/… 我已经看过那个帖子,但它对我没有帮助。仍然崩溃 尝试将jsonasynctask的初始化移到onCreateView函数中。 嗨,克里希纳,感谢您的回答。如果我这样做,那么我在 onJobFinishListener 中的 jsonasynctasks 将不会被初始化 【参考方案1】:对于 AsyncTask 崩溃是因为可能在您的片段实例上多次调用 onCreateView
,尝试这样做以确保每次执行()调用您都有一个新实例
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
// Inflate the layout for this fragment
View view = inflater.inflate( R.layout.fragment_data_tabel, container, false );
sensor1 = (TextView) view.findViewById( R.id.sensorAlleBox );
new jsonAsynctask( this ).execute();
return view;
另一方面,如果您不喜欢一直创建新实例,请确保将调用包装在异步状态调用检查中,以确保您在运行时不会启动相同的异步:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
// Inflate the layout for this fragment
View view = inflater.inflate( R.layout.fragment_data_tabel, container, false );
sensor1 = (TextView) view.findViewById( R.id.sensorAlleBox );
if(jsonasynctask.getState() != AsyncTask.Status.RUNNING)
jsonasynctask.execute();
return view;
最后,如果您在 AsyncTask 类中使用 Context,请确保使用 WeekReference 以确保您不会在 AsynTask 中持有强引用
【讨论】:
以上是关于Asynctask 崩溃 ViewPager RecyclerView (Android)的主要内容,如果未能解决你的问题,请参考以下文章
AsyncTask 在 ViewPager 的每个页面上运行
带有适配器“”的 ViewPager 需要 AsyncTask 中的视图 ID
如何在将 Tablayout 与 viewpager 一起使用时从另一个片段调用 AsyncTask?
如何从 ViewPager 的 onPageSelected AsyncTask 到 Fragments?