从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
传递给cpk
的constructor
,并在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); }