从Asynctask返回结果

如果我在我的Android应用程序中有这个后台工作文件并且它从我的数据库中获取数据,我怎么能将字符串’result’传递给另一个类? 后台工作者连接到我的服务器,然后使用php连接到数据库。

public class BackgroundWorker extends AsyncTask { 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); } } 

从后台线程获取回调的最佳方法是使用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传递给cpkconstructor ,并在onPostExecute调用它, onPostExecute所示:

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

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

你需要一个倾听者。 这将允许您在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); }