2016-05-17 7 views
0

を作成したときAsyncTaskが最初から実行されていない、私は問題に直面している:私は2つの活動を作成しました。
ボタンを持つメインのアクティビティが1つあります。私は、このボタンをクリックし
は、第二の活動が開始されます。
第二の活動は、私が直面してる何Textview活動が

でこの番号を番号が1から10までインクリメントされるAsynctaskを使用し、ディスプレイAsynctaskは、その後完了していない間、私は戻るボタンをクリックしたときにということです再度最初のアクティビティAsynctaskが開始からすぐに実行されないようにします。

それは古いタスクを完了したときに、バックグラウンドで、それが再び新しいタスクを開始しますので、私は知っています。アクティビティを破壊するときにこれを修正する方法はありますか?Asynctaskも破壊されますか?ここで

は私の問題のためvideo sampleです。主な活動のための
コード:セカンド活動の

public class MainActivity extends AppCompatActivity { 
    Button bt; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     bt = (Button) findViewById(R.id.bt); 

     bt.setOnClickListener(new View.OnClickListener() { 


      @Override 
      public void onClick(View v) { 

       Intent i = new Intent(MainActivity.this,SecondAcitivity.class); 

       startActivity(i); 

      } 
     }); 


    } 
} 

コード:あなたがボタンを押すとバック​​

public class SecondAcitivity extends AppCompatActivity { 

    TextView t1; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_second_acitivity); 


     t1 = (TextView) findViewById(R.id.t1); 
     OurWork obj = new OurWork(); 
     obj.execute(); 

    } 


    class OurWork extends AsyncTask<Void, Integer, String> { 


     @Override 
     protected String doInBackground(Void... params) { 

      int i = 0; 
      while (i < 11) { 

       try { 
        Thread.sleep(700); 
        publishProgress(i); 
        i++; 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
      return "Successfully Completed"; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 

      t1.setText(values[0] + "%"); 

     } 


     @Override 
     protected void onPostExecute(String result) { 

      t1.setText(result); 

     } 


    } 

} 
+0

あなたはyourAsyncTask.cancel(true)を呼び出すことができます。戻るボタンを押してください。その後asyncTaskが実際にキャンセルbeeingてされて実行されている.... – Opiatefuchs

+0

@Opiatefuchsあなたは、コード – hamel123

答えて

0

あなたが押された背中にタスクをキャンセルする必要がある、とあなたはdoInbackground()を実行中のタスクがキャンセルされたかどうかを監視する必要があります。

1-オーバーライドonbackpressed:whileループの次の反復に

@Override 
public void onBackPressed() { 
    obj.cancel(true); // where obj is the asyncTask refernce object name 
    super.onBackPressed(); 
} 

2-モニターisCanceled()

@Override 
protected String doInBackground(Void... params) { 

    int i = 0; 
    while (i < 11 && !isCancelled()) { // added !isCancelled() 

     try { 
      Thread.sleep(700); 
      publishProgress(i); 
      i++; 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
    return "Successfully Completed"; 
} 

cancel(true);が呼び出された後、ループは終了します、そしてdoInBackground()が返します。バックが押されたときに、onBackPressedにこれを追加し実行している場合でも、asyncTaskをキャンセルする

+0

この 'super.onPostExecute()'や 'super.onBackPressed()'のようなAsyncTaskメソッドをオーバーライドするときには、この行を書く必要があります。 – hamel123

+0

@ hamel123 'super。onPostExecute() 'は必要ではありませんが、他のオーバーライドの場合は、それを親クラス(superクラス)に依存して書く必要があります。つまり、同じメソッド' onPostExecute() 'または' onBackPressed親クラスに存在するオブジェクト指向、オーバーライド、オーバーロードに関する詳細を読む – Yazan

0

onBackPressed callbackが呼び出されます。だから、基本的にはこれを試すことができます。

@Override 
public void onBackPressed() { 
    if (asyncFetch.getStatus() == AsyncTask.Status.RUNNING) { 
     asyncFetch.cancel(true); 
    } 
    finish(); 
} 
+0

私はあなたの方法が、同じ問題の戻るボタンで発生しようとしてこれを行うことができます! – hamel123

0

は、使用してみてください:

private OurWork task; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_second_acitivity); 


    t1 = (TextView) findViewById(R.id.t1); 
    task = new OurWork(); 
    task.execute(); 

} 

@Override 
    public void onBackPressed() { 
     task.cancel(true); 
     super.onBackPressed(); 
    } 
0

AsyncTaskそれがホストされた活動のバックグラウンドで実行されます。 OnPauseまたはOnDestroyが呼び出されると、AsyncTaskが破棄されるため、この問題を解決するには、OnResumeをオーバーライドしてAsyncTaskを再度実行します。

+0

私はバックボタンを押したときにAsyncTaskを破棄したい場合 – hamel123

+0

大域整数としてiを設定し、onPauseまたはonBackPessをi = 11に設定すると、AsyncTaskが破棄され、再開セットi = 0で破棄され、AsyncTaskが再び実行されます。 – Franklyn

0

public class SecondAcitivity extends AppCompatActivity { 

    TextView t1; 
    static OurWork obj; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_second_acitivity); 


     t1 = (TextView) findViewById(R.id.t1); 
     obj = new OurWork(); 
     obj.execute(); 

    } 


    class OurWork extends AsyncTask<Void, Integer, String> { 


     @Override 
     protected String doInBackground(Void... params) { 

      int i = 0; 
      while (i < 11) { 

       try { 
        Thread.sleep(700); 
        publishProgress(i); 
        i++; 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
      return "Successfully Completed"; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 

      t1.setText(values[0] + "%"); 

     } 


     @Override 
     protected void onPostExecute(String result) { 

      t1.setText(result); 

     } 


    } 

    //override onBackPressed and do this 
    @Override 
    public void onBackPressed() { 
     if (obj!=null && (obj.getStatus()== AsyncTask.Status.RUNNING || 
       obj.getStatus()== AsyncTask.Status.PENDING)) 
      obj.cancel(true); 

     super.onBackPressed(); 
    } 
}