2

アプリケーションを閉じた後、Fragment クラスで AsyncTask を停止する方法は?

MainActivity クラス

public class MainActivity extends FragmentActivity {

}

BaseFragment クラスは Fragment によって拡張されます

public class BaseFragment extends Fragment {
    public MainActivity mActivity;
    
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        mActivity       =   (ChatActivity)this.getActivity();
    
    }
    
    public boolean onBackPressed(){
        return false;
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data){
        
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }

    
}

フラグメントクラス

public class Fragment1 extends BaseFragment{


private  Update  task;
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        
        toCallAsynchronous();

        return inflater.inflate(R.layout.activity_online_korisnici, container,
                false);
    }


     public void toCallAsynchronous() {
            final Handler handler = new Handler();
            Timer timer = new Timer();
            TimerTask doAsynchronousTask = new TimerTask() {       
                @Override
                public void run() {
                    handler.post(new Runnable() {
                        public void run() {       
                            try {
                             task =new Update();
                             
                                // PerformBackgroundTask this class is the class that extends AsynchTask 
                                task.execute("");
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                            }
                        }
                    });
                }
            };
            timer.schedule(doAsynchronousTask, 0, 5000); //execute in every 50000 ms
        }




   private class Update extends AsyncTask<Object, Object, List<Object>>{

    @Override
        protected List<Object> doInBackground(Object... params) {
                     
                 }

@Override
        protected void onPostExecute(List<Object> result) {


}

   }


}
4

3 に答える 3

7

Fragment の onPause() メソッドを使用できます。Fragment が再開されなくなったときに呼び出されます。これは通常、含まれているアクティビティのライフサイクルの Activity.onPause に関連付けられています。

@Override
public void onPause() {
    super.onPause();
    task.cancel();
}

更新: TabHost の下にいて、別のタブを押したときに Fragment が一時停止している場合は、そうすることができます

アクティビティにフラグメント ID またはタグを保存する

フラグメントでタスクを停止するメソッドを実装する

public void onActivityPause() {
    task.cancel();
}

あなたの活動で onPause()

@Override
protected void onPause() {
    super.onPause();
    FragmentManager fm = getFragmentManager();
    for (int id : ids) {
        Fragment f = fm.findFragmentById(id);
        try {
            Method stop = f.getClass().getMethod("onActivityPause");
            close.invoke(f);
        } catch (Exception e) {}
    }
}

しかし、いずれにしても TabHost は使用しません。非推奨です。v4 バージョンをサポートする必要がある場合は、ActionBar または ActionBarSherlock の使用を検討してください。

于 2013-01-08T14:49:50.223 に答える
3

task.cancel()やります。存在しない UI へのアクセス/更新を回避するために、 とに頻繁なチェックを含めるようにisCancelled()してください。onBackground()onPostExecute()

于 2013-01-08T14:13:37.790 に答える
-1

同様の問題がありました。基本的に、ユーザーがアクティビティを破棄した後、非同期タスクで NPE を取得していました。Stack Overflow で問題を調査した後、次の解決策を採用しました。

ブール実行;

public void onActivityCreated (Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


public void onDestroy() {
    super.onDestroy();

    running=false;
    ...
}

次に、非同期コードで定期的に「実行中かどうか」を確認します。私はこれをストレステストしましたが、現在、アクティビティを「中断」することはできません。これは完全に機能し、SO で見たいくつかのソリューションよりもシンプルでエラーが発生しにくいという利点があります。

于 2013-05-26T16:40:29.313 に答える