如何停止直到线程完成其工作

时间:2015-06-03 11:53:48

标签: android multithreading

只看下面的代码:

 new Thread(new Runnable() {                    
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    rs=net.incCount(emp_id);
                    try{                            
                        JSONArray j_array=new JSONArray(rs);
                        JSONObject j_object=j_array.getJSONObject(0);
                        count_val=j_object.getInt("countget");
                        System.out.println("1 "+count_val);
                        updateStatus=j_object.getString("ins_status");
                        System.out.println("1 "+updateStatus);
                    }
                    catch(Exception e){
                        System.out.println("Catch Error "+e.getMessage());
                    }
                }
            }).start();

            if(updateStatus.equals("true")){
                System.out.println("got al "+count_val);
                selectedItem.setCount(count_val);                   
            }
            else{
                Toast.makeText(getContext(),"Not Updated Please Check Internet Connection", Toast.LENGTH_LONG).show();
            }

从此我的数据库得到更新但应用程序停止工作,线程执行并在线程完成之前检查if(updateStatus.equals("true"))条件。得到null。所以我应该如何检查这意味着我应该如何停止,直到线程完成其工作,然后执行以下代码。

2 个答案:

答案 0 :(得分:0)

您正在使用的方法是在主线程中执行...如果它需要很长时间,那么您的应用程序将被OS关闭。尝试使用AsyncTask:

public class MyClass extends AsyncTask<String, String, String>
{
    //variables to use across this class 

    @Override
    protected String doInBackground(String... params) {
        //Do anything like download, API call etc...

    }
    @Override
    protected void onPostExecute(String result) {
        //in post execute, set your result data. Like set data to textview, edittext, listview etc....

                }
}

每当你想要完成这项任务时,只需定义如下:

new MyClass().execute();

答案 1 :(得分:0)

您无法阻止主线程(系统会检测到 A 活动是 N ot R ,并将关闭您的应用)。

您的第一个选择是使用AsyncTask并在<{3}}方法中后台作业后执行代码

其他选项是在后台作业结束时将消息从您的主题发布到主线程:

 new Thread(new Runnable() {

            @Override
            public void run() {
                //prepare the stuff to send a message to the main thread
                Looper.prepare();
                Handler handler = new Handler(Looper.getMainLooper());

                ... //do the backgroud job here
                updateStatus = ... ; //what ever

                if(updateStatus){
                    handler.post(new Runnable(){
                         public void run(){
                             selectedItem.setCount(count_val);
                         }
                    });
                }else{
                    handler.post(new Runnable(){
                         public void run(){
                             Toast.makeText(getContext(),"Not Updated Please Check Internet Connection", Toast.LENGTH_LONG).show();
                         }
                    });
                }
            }
        }).start();

请注意,选项2更多是低级并帮助您了解如何使用经典 java线程...但最后:AsyncTask是为你做所有这些恼人的锅炉板代码。 (换句话说:使用AsyncTask更好)