首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将字符串从Post Execute传递到全局变量

将字符串从Post Execute传递到全局变量
EN

Stack Overflow用户
提问于 2018-09-09 18:18:21
回答 2查看 41关注 0票数 0

我试图将onPostexecute上的结果传递给Global Variabless类,并获取booklist类中的值,以检查bookid和借款人id是否已经存在于我的数据库中。我的php起作用了。

BackgroundWorkerReserve类

代码语言:javascript
复制
/**
* 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();
    }
}

全局变量类

代码语言:javascript
复制
public class GlobalVariable {
    public  static String  BorrowerID;
    public  static  String Checker_Result;
}

Booklist类:

代码语言:javascript
复制
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上为它敬酒时,它却有价值

EN

回答 2

Stack Overflow用户

发布于 2018-09-09 18:36:12

异步任务doInBackground运行在不同的线程上。因此,在bwChecker.execute()之后,将调用异步任务doInBackground,并且在bwChecker.execute()之后的代码将在onPostExecute.之前执行,以便将结果发送回activity。您可以使用onPostExecute.中的broadcastReceiver

编辑

在你的BookList

代码语言:javascript
复制
    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

代码语言:javascript
复制
    Intent intent = new Intent(BookList.BROADCAST_ACTION);
    intent.putExtra("CHECKER_RESULT", result);
    LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
票数 0
EN

Stack Overflow用户

发布于 2018-09-09 18:51:45

我建议您创建监听器/回调,如下所示

第一步:创建监听器/回调

代码语言:javascript
复制
public interface OnProcessCallback{
  public void onComplete(String data);
}

第2步:修改AsyncTask构造函数

代码语言:javascript
复制
OnProcessCallback callback;
backWorkerReserveCheck(Context ctx,OnProcessCallback callback){
    context = ctx;
    this.callback = callback;
}

第3步:修改onPostExecute

代码语言:javascript
复制
@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    callback.onComplete(result);
    Toast.makeText(context, GlobalVariable.Checker_Result, Toast.LENGTH_SHORT).show();
}

步骤最终

代码语言:javascript
复制
backWorkerReserveCheck bwChecker = new backWorkerReserveCheck(BookList.this, new OnProcessCallback(){
  public void onComplete(String data){
   // do the stuff here
  }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52243501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档