我试图将onPostexecute上的结果传递给Global Variabless类,并获取booklist类中的值,以检查bookid和借款人id是否已经存在于我的数据库中。我的php起作用了。
BackgroundWorkerReserve类
/**
* Created by ivan on 9/9/2018.
*/
public class backWorkerReserveCheck extends AsyncTask<String, String ,String> {
Context context;
backWorkerReserveCheck(Context ctx){
context = ctx;
}
@Override
protected String doInBackground(String... params) {
String Checker_url = "http://192.168.254.120/LibrayAPI/ReservationChecker.php";
String type = params[0];
if (type.equals("Checking")){
String BorrowerID = params[1];
String BookID = params[2];
try {
String data = URLEncoder.encode("borrower_id","UTF-8") + "=" +
URLEncoder.encode(BorrowerID,"UTF-8");
data += "&" + URLEncoder.encode("book_id","UTF-8") + "=" +
URLEncoder.encode(BookID,"UTF-8");
URL url = new URL(Checker_url);
URLConnection urlConnection = url.openConnection();
urlConnection.setDoOutput(true);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter((urlConnection.getOutputStream()));
outputStreamWriter.write(data);
outputStreamWriter.flush();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
sb.append(line);
break;
}
publishProgress(sb.toString());
return sb.toString();
}catch (Exception ex){
return new String("Error"+ ex.getMessage());
}
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
GlobalVariable.Checker_Result = result;
Toast.makeText(context, GlobalVariable.Checker_Result, Toast.LENGTH_SHORT).show();
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
GlobalVariable.Checker_Result = values.toString();
}
}
全局变量类
public class GlobalVariable {
public static String BorrowerID;
public static String Checker_Result;
}
Booklist类:
public class BookList extends AppCompatActivity {
ListView listBooks;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book_list);
listBooks = findViewById(R.id.listView);
StrictMode.setThreadPolicy((new StrictMode.ThreadPolicy.Builder().permitNetwork().build()));
collectData();
CustomAdapter customAdapter = new CustomAdapter(this, bookId, booktittle, Quantity, Author);
listBooks.setAdapter(customAdapter);
listBooks.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
TextView id = view.findViewById(R.id.txtBookID);
Date currentDate = Calendar.getInstance().getTime();
SimpleDateFormat SF = new SimpleDateFormat("yyyy-MM-dd");
String currentsateFormat = SF.format(currentDate);
backgroundWorkerReserve bw = new backgroundWorkerReserve(BookList.this);
backWorkerReserveCheck bwChecker = new backWorkerReserveCheck(BookList.this);
bwChecker.execute("Checking",GlobalVariable.BorrowerID,id.getText().toString());
if (GlobalVariable.Checker_Result.equals("Has rows")){
Toast.makeText(BookList.this, "You already reserve this book", Toast.LENGTH_SHORT).show();
}else {
String type = "Reserve";
bw.execute(type, GlobalVariable.BorrowerID, id.getText().toString(), currentsateFormat);
}
return false;
}
});
}
}
但在我的长点击中,GlobalVariable.BorrowerIDh似乎没有价值,但当我在我的onpostExecute上为它敬酒时,它却有价值
发布于 2018-09-09 18:36:12
异步任务doInBackground
运行在不同的线程上。因此,在bwChecker.execute()
之后,将调用异步任务doInBackground
,并且在bwChecker.execute()
之后的代码将在onPostExecute.
之前执行,以便将结果发送回activity。您可以使用onPostExecute.
中的broadcastReceiver
编辑
在你的BookList
中
public static final String BROADCAST_ACTION = "BROADCAST_ACTION";
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction() != null &&
intent.getAction().equals(BROADCAST_ACTION)) {
Bundle bundle = intent.getExtras();
if (bundle!=null){
String type = bundle.getString("CHECKER_RESULT");
if (type.equals("Has rows")){
Toast.makeText(BookList.this, "You already reserve this book", Toast.LENGTH_SHORT).show();
}
else {
// Not sure were you are setting value to `GlobalVariable.BorrowerID` as i didnt found it in code you have posted
bw.execute("Reserve", GlobalVariable.BorrowerID, id.getText().toString(), currentsateFormat);
}
}
}
}
};
@Override
protected void onResume() {
super.onResume();
LocalBroadcastManager.getInstance(
BookList.this).registerReceiver(broadcastReceiver, new IntentFilter(BROADCAST_ACTION));
}
@Override
protected void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(BookList.this).unregisterReceiver(broadcastReceiver);
}
在你的onPostExecute
中
Intent intent = new Intent(BookList.BROADCAST_ACTION);
intent.putExtra("CHECKER_RESULT", result);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
发布于 2018-09-09 18:51:45
我建议您创建监听器/回调,如下所示
第一步:创建监听器/回调
public interface OnProcessCallback{
public void onComplete(String data);
}
第2步:修改AsyncTask构造函数
OnProcessCallback callback;
backWorkerReserveCheck(Context ctx,OnProcessCallback callback){
context = ctx;
this.callback = callback;
}
第3步:修改onPostExecute
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
callback.onComplete(result);
Toast.makeText(context, GlobalVariable.Checker_Result, Toast.LENGTH_SHORT).show();
}
步骤最终
backWorkerReserveCheck bwChecker = new backWorkerReserveCheck(BookList.this, new OnProcessCallback(){
public void onComplete(String data){
// do the stuff here
}
});
https://stackoverflow.com/questions/52243501
复制相似问题