【问题标题】:Returning result from Asynctask从 Asynctask 返回结果
【发布时间】:2017-04-29 01:25:00
【问题描述】:

如果我的 android 应用程序中有这个后台工作文件并且它从我的数据库中获取数据,我如何将字符串“result”传递给另一个类? 后台工作人员连接到我的服务器,然后使用 php 连接到数据库。

public class BackgroundWorker extends AsyncTask<String,Void,String> {
    Context context;
    AlertDialog alertDialog;
    BackgroundWorker (Context ctx) {
        context = ctx;
    }

    @Override
    public String doInBackground(String... params) {
        String type = params[0];
        String specials_url = "";

        if(type.equals("venue click")) {
            try {
                //String user_name = params[1];
                URL url = new URL(specials_url);
                HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setDoOutput(true);
                httpURLConnection.setDoInput(true);
                OutputStream outputStream = httpURLConnection.getOutputStream();
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
              //  String post_data = URLEncoder.encode("user_name","UTF-8")+"="+URLEncoder.encode(user_name,"UTF-8");
               // bufferedWriter.write(post_data);
                bufferedWriter.flush();
                bufferedWriter.close();
                outputStream.close();
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"));
                String result="";
                String line="";
                while((line = bufferedReader.readLine())!= null) {
                    result += line;
                }
                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();
                return result;
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return null;
    }

    @Override
    protected void onPreExecute() {
        alertDialog = new AlertDialog.Builder(context).create();
        alertDialog.setTitle("Info");
    }

    @Override
    protected void onPostExecute(String result) {
        alertDialog.setMessage(result);
        alertDialog.show();

       // String temp = "login success";

      //  if (result.equals(temp)) {
       //     Intent intent = new Intent(context, Register.class);
         //   context.startActivity(intent);
      //  }


    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }

}

【问题讨论】:

    标签: java android string android-asynctask


    【解决方案1】:

    你需要一个倾听者。这将允许您在AsyncTask 完成时通知您。

    通过创建接口来定义监听器,如下所示:

    public interface IListener 
    {
        void onCompletedTask(String result);
    }
    

    在任务上存储对侦听器的引用。

    private IListener mListener;
    
    // Pass the reference to the constructor.
    public BackgroundWorker(IListener listener)
    {
        mListener = listener;
    }
    

    然后你像这样通知监听器。

    @Override
    protected void onPostExecute(String result) 
    {
        mListener.onCompletedTask(result);
    }
    

    【讨论】:

      【解决方案2】:

      从后台线程获取回调的最佳方法是使用 interfaces 作为来自 AsyncTask 的回调,例如:

      创建一个可以在onPostExecute()中调用的接口

      public interface ResponseCallback {
      
          void onRespond(String result);
      }
      

      在调用 asynckTask 之前定义如下:

         ResponseCallback cpk = new ResponseCallback() {
                  @Override
                  public void onRespond(String result) {
                    //code to be done after calling it from onPostExecute
                  }
              };
      

      并将cpk 传递给asynckTaskconstructor 并像这样在onPostExecute 中调用它:

      if(cpk!=null){
        cpk.onRespond(result);
      }
      

      当然,您可以将interface 的签名修改为您想要的任何内容。

      【讨论】:

      • 为什么我的答案是-1?!
      猜你喜欢
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 2011-05-10
      • 1970-01-01
      相关资源
      最近更新 更多