只看下面的代码:
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
。所以我应该如何检查这意味着我应该如何停止,直到线程完成其工作,然后执行以下代码。
答案 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更好)