2017-04-26 3 views
-1

私はタイマーと他のフラグメントにリンクする他の4つのボタンを使って定期的に画像を変更する画像ボタンを含むフラグメントを持っています。いずれかのボタンを押すと、その特定のフラグメントにジャンプしますが、戻るボタンを押すと、アプリケーションがクラッシュします。私はtimer.cancelを試しましたが、うまくいきませんでした。ここでフラグメントのコードは次のとおりです。ここで不正な状態の例外:タスクが既にスケジュールされているかキャンセルされています

public class Main2Activity extends Fragment { 
View v; 
Timer timer; 
ImageView iv; 
int i=0; 
Integer[] imagechange = { 

     R.drawable.capture1,R.drawable.capture2,R.drawable.capture,R.drawable.capture 

}; 
String[] linkstop = new String[]{"http://www.webmd.com/","http://www.drugs.com/","http://www.cancer.gov/","http://www.nlm.nih.gov/medlineplus/"}; 
ListView lv; 
TimerTask updateTask = new TimerTask() { 

    @Override 
    public void run() { 

     getActivity().runOnUiThread(new Runnable() { 

      @Override 
      public void run() { // TODO Auto-generated method stub 
       iv.setImageResource(imagechange[i]); 
       i++; 
       if (i > 3) { 
        i = 0; 
       } 
      } 

     }); 
    } 
}; 



@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
v=inflater.inflate(R.layout.activity_main2,container,false); 
    //lv=(ListView)v.findViewById(R.id.list); 
    iv=(ImageView)v.findViewById(R.id.imge); 
    timer = new Timer(); 
    timer.scheduleAtFixedRate(updateTask,0,2000); 
    Button btn=(Button)v.findViewById(R.id.a); 
    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      // timer.cancel(); 
      // timer=null; 

      HomeFragment q=new HomeFragment(); 
      FragmentManager fm=getFragmentManager(); 
      FragmentTransaction ft=fm.beginTransaction(); 
      ft.replace(R.id.container_body,q); 
       ft.addToBackStack(null); 
      ft.commit(); 


     } 
    }); 
    Button btn1=(Button)v.findViewById(R.id.b); 
    btn1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      // timer.cancel(); 
      // timer=null; 

      QueriesFragment q=new QueriesFragment(); 
      FragmentManager fm=getFragmentManager(); 
      FragmentTransaction ft=fm.beginTransaction(); 
      ft.replace(R.id.container_body,q); 
      ft.addToBackStack(null); 
      ft.commit(); 


     } 
    }); 
    Button btn2=(Button)v.findViewById(R.id.c); 
    btn2.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // timer.cancel(); 
      // timer=null; 


      EquipmentsFragment q=new EquipmentsFragment(); 
      FragmentManager fm=getFragmentManager(); 
      FragmentTransaction ft=fm.beginTransaction(); 
      ft.replace(R.id.container_body,q); 
      ft.addToBackStack(null); 
      ft.commit(); 


     } 
    }); 
    Button btn3=(Button)v.findViewById(R.id.d); 
    btn3.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      // timer.cancel(); 
      //timer=null; 

      PostQueryFragment q=new PostQueryFragment(); 
      FragmentManager fm=getFragmentManager(); 
      FragmentTransaction ft=fm.beginTransaction(); 
      ft.replace(R.id.container_body,q); 
      ft.addToBackStack(null); 
      ft.commit(); 


     } 
    }); 
    iv.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      try { 
       Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(linkstop[i])); 
       startActivity(myIntent); 
      } catch (ActivityNotFoundException e) { 
       Toast.makeText(getActivity(), "No application can handle this request." 
         + " Please install a webbrowser", Toast.LENGTH_LONG).show(); 
       e.printStackTrace(); 
      } 
     } 
    }); 


return v; 

} 


} 

は、ログファイルの詳細です:

java.lang.IllegalStateException: Task already scheduled or cancelled 
                at java.util.Timer.sched(Timer.java:401) 
                at java.util.Timer.scheduleAtFixedRate(Timer.java:328) 
                at com.example.aakar.agstart.Main2Activity.onCreateView(Main2Activity.java:82) 
                at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789) 
                at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955) 
                at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 
                at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:960) 
                at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1553) 
                at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:506) 
                at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:178) 
                at android.app.Activity.onKeyUp(Activity.java:2725) 
                at android.view.KeyEvent.dispatch(KeyEvent.java:2712) 
                at android.app.Activity.dispatchKeyEvent(Activity.java:3029) 
                at android.support.v7.internal.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:49) 
                at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:258) 
                at android.support.v7.internal.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:49) 
                at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:320) 
                at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4331) 
                at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4302) 
                at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853) 
                at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3906) 
                at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3872) 
                at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3999) 
                at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3880) 
                at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4056) 
                at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853) 
                at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3906) 
                at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3872) 
                at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3880) 
                at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853) 
                at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3906) 
                at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3872) 
                at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4032) 
                at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4193) 
                at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2400) 
                at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1964) 
                at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1955) 
                at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2377) 
                at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141) 
                at android.os.MessageQueue.nativePollOnce(Native Method) 
                at android.os.MessageQueue.next(MessageQueue.java:323) 
                at android.os.Looper.loop(Looper.java:136) 
                at android.app.ActivityThread.main(ActivityThread.java:6121) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 

答えて

3

あなたはすでにタイマーに予定TimerTaskをを再利用することはできません。このようにコードを変更し

timer = new Timer(); 
timer.scheduleAtFixedRate(createTimerTask(), 0, 100); 

と、このような関数を作成し、

private TimerTask createTimerTask() { 
     return new TimerTask() { 
      @Override 
      public void run() { 
       getActivity().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         iv.setImageResource(imagechange[i]); 
         i++; 
         if (i > 3) { 
          i = 0; 
         } 
        } 

       }); 
      } 
     }; 
    } 
+0

はチームメイトありがとう!!出来た。 –

+0

正解を受け入れてください – Krish

関連する問題