如何在android上安全地停止运行Fragment的线程?

时间:2014-12-09 15:12:20

标签: android multithreading android-fragments

我想知道如何在android上安全地停止运行线程和asyncTask片段。

这是我的代码:

public class MainActivity extends FragmentActivity {

    public Fragment mFragment;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        Button btn_next = (Button) findViewById(R.id.button_next);
        btn_next.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                ((FragmentOne)mFragment).infoThread.interrupt();
            }
        });

        Intent intent = getIntent();
        String start_fragment = intent.getStringExtra("start_fragment"); 

        onShowFragment(start_fragment);
    }

    public void onShowFragment(String select_fragment) {

        Fragment fr = null;

        switch (select_fragment) {
        case "fragment1":
            fr = new FragmentOne();
            break;
        case "gragment2":
            fr = new FragmentTwo();
            break;
        }

        FragmentTransaction ft = getFragmentManager().beginTransaction(); 
        ft.replace(R.id.fragment_place, fr); 
        ft.commit(); 
    }
  }

  public class FragmentOne extends Fragment {

    public Thread infoThread;
    public View view_one;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        view_one = inflater.inflate(R.layout.fragment_one, container, false);

        onGetInfo();
        return view_one;
    }

    public void onGetInfo() {

        infoThread= new Thread(new Runnable() {
            @Override
            public void run() {

                String response_info = HTTPUtils.HTTPPost(Global.USER_URL, 
                        "name", "abc", 
                        "password", "1234");
                processGetInfo(response_info);
            }
        });
        infoThread.start();
    } 

  }

在此处,点击 btn_next按钮时,会出现致命错误错误。 请帮帮我。

2 个答案:

答案 0 :(得分:0)

尝试使用:

infoThread.stop()

而不是:

infoThread.interrupt();

答案 1 :(得分:0)

您永远不会使用值初始化mFragment

mFragment = fr;添加到onShowFragment

但是,如果继续沿着这条路走下去,你将会遇到各种各样的问题。您应该考虑一个比在Fragment的onCreateView方法中生成的线程中执行http请求更强大的框架。