Java 使用doInBackground的结果设置文本视图
我是Android新手,我试图使用php脚本和本地主机通信,并访问一个简单的数据库。 我在doInBackground()方法中定义了一个任务,它从本地主机上存储的数据库中获取一个值(我不知道该部分是否有效)。 我想使用doInBackground方法返回的结果在活动的textview中设置文本Java 使用doInBackground的结果设置文本视图,java,android,android-asynctask,Java,Android,Android Asynctask,我是Android新手,我试图使用php脚本和本地主机通信,并访问一个简单的数据库。 我在doInBackground()方法中定义了一个任务,它从本地主机上存储的数据库中获取一个值(我不知道该部分是否有效)。 我想使用doInBackground方法返回的结果在活动的textview中设置文本 public class BackgroundWorker extends AsyncTask<String,Void,String> { Context context;
public class BackgroundWorker extends AsyncTask<String,Void,String> {
Context context;
BackgroundWorker(Context ctx)
{
context = ctx;
}
@Override
protected String doInBackground(String... params) {
String group = params[0];
String child = params[1];
String address = "http://10.0.2.2/conn.php";
URL url = null;
try {
url = new URL(address);
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("group", "UTF-8") + "=" + URLEncoder.encode(group, "UTF-8") + "&"
+ URLEncoder.encode("child", "UTF-8") + "=" + URLEncoder.encode(child, "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();
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
}
我想设置txtName2。您可以使用接口将数据返回到活动中 接口
public interface AsyncResponse {
public void onFinish(Object output);
}
SomeAsyncTask类
public class SomeAsyncTask extends AsyncTask<String, String, String> {
private AsyncResponse asyncResponse;
public SomeAsyncTask(AsyncResponse asyncResponse) {
this.asyncResponse = asyncResponse;
}
@Override
protected String doInBackground(String... params) {
//Do something
.....
//Finally return something
return "returnSomeString";
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
asyncResponse.onFinish(s);
}}
SomeAsyncTask someAsyncTask=new SomeAsyncTask(new AsyncResponse() {
@Override
public void onFinish(Object output) {
String result= (String) output;
//Finally set your views
}
});
someAsyncTask.execute();
}
这是主线程中的字符串
protected void onPostExecute(String s) {
// s is your string
super.onPostExecute(s);
}
在BackgroundWorker类中添加以下代码
private String textFortxtName2;
public String getTextFortxtName2() {
return textFortxtName2;
}
public void setTextFortxtName2(String textFortxtName2) {
this.textFortxtName2 = textFortxtName2;
}
然后加上这个
protected void onPostExecute(String s) {
// s is your string
textFortxtName2 = s;
super.onPostExecute(s);
}
现在您可以从您的主要活动中获取文本
...
BackgroundWorker backgroundWorker = new BackgroundWorker(this);
backgroundWorker.execute(group,child);
txtName2.setText(backgroundWorker.getTextFortxtName2());
就这些:)
如果有任何问题或疑问,请定义一个接口以获取backgroundworker的结果,并使workers构造函数获取该接口的第二个参数。在执行后调用该接口对象并将结果作为参数。而不是像这样使用它:
BackgroundWorker backgroundWorker = new BackgroundWorker(this, new bgWorkerListener() {
@Override
public void onResult(String s) {
txtname2.settext(s);
}
});
backgroundWorker.execute(group, child);
调用
doInBackground
后,返回结果,然后将这些结果传递到onPostExecute
,在那里可以设置txtName2.setText(结果)
BackgroundWorker和viewTT是两个不同的文件吗?您可以使用eventBus库解决问题。如果任务未完成(通常不会完成),该怎么办?BackgroundWorker(上下文ctx){Context=ctx;}
后台工作者类的构造函数仍然只初始化上下文可以吗?我不明白你的问题,会发生什么?你有一个包,,,你必须在方法结束之前添加返回结果我是说你的getTextFortxtName2()函数大部分时间将返回null。您创建了一个对asynctask内部活动的硬引用,这很容易导致内存泄漏。如果他想要内存泄漏,最好使用静态
,而不是使用太多代码。如果不建议我做错事,现在可以吗。
BackgroundWorker backgroundWorker = new BackgroundWorker(this, new bgWorkerListener() {
@Override
public void onResult(String s) {
txtname2.settext(s);
}
});
backgroundWorker.execute(group, child);