Java onPostExecute从服务器检索空值
我尝试使用AsyncTask从服务器读取数据,但当我将参数赋给onPostExecute时,它检索到null。MainActivity类:Java onPostExecute从服务器检索空值,java,android,android-asynctask,Java,Android,Android Asynctask,我尝试使用AsyncTask从服务器读取数据,但当我将参数赋给onPostExecute时,它检索到null。MainActivity类: public class MainActivity extends Activity{ EditText name, password; Button login; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanc
public class MainActivity extends Activity{
EditText name, password;
Button login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name = (EditText) findViewById(R.id.name);
password = (EditText) findViewById(R.id.password);
login = (Button) findViewById(R.id.login);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView uiUpdate = (TextView) findViewById(R.id.output);
String outputasync = uiUpdate.getText().toString();
String serverURL = "http://192.168.1.105/myapp/text.php";
LongOperation longOperation = new LongOperation(MainActivity.this);
longOperation.execute(serverURL);
longOperation.onPostExecute(uiUpdate);
}
});
}
public class MainActivity extends Activity{
EditText name, password;
Button login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name = (EditText) findViewById(R.id.name);
password = (EditText) findViewById(R.id.password);
login = (Button) findViewById(R.id.login);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView uiUpdate = (TextView) findViewById(R.id.output);
String outputasync = uiUpdate.getText().toString();
String serverURL = "http://192.168.1.105/myapp/text.php";
LongOperation longOperation = new LongOperation(MainActivity.this, uiUpdate);
longOperation.execute(serverURL, outputasync);
}
});
}
异步任务:
public class LongOperation extends AsyncTask<String, Void, String> {
private Context mcontext;
private String content;
private String error = null;
AlertDialog alertDialog;
public LongOperation(Context context){
mcontext = context ;
}
@Override
protected void onPreExecute() {
alertDialog = new AlertDialog.Builder(mcontext).create();
alertDialog.setTitle("Login Information....");
}
@Override
protected String doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
HttpURLConnection client = (HttpURLConnection)url.openConnection();
client.connect();
InputStream inputStream = client.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
content = bufferedReader.readLine();
bufferedReader.close();
inputStream.close();
client.disconnect();
} catch (IOException e) {
error = e.getMessage();
}
return null;
}
protected void onPostExecute(TextView unused) {
alertDialog.dismiss();
if (error != null) {
unused.setText("Output : " + error);
} else {
unused.setText("Output : "+ content);
}
}
}
public class LongOperation extends AsyncTask<String, Void, String> {
TextView textviews;
private Context mcontext;
private String content;
private String error = null;
AlertDialog alertDialog;
public LongOperation(Context context, TextView textView){
textviews = textView;
mcontext = context ;
}
@Override
protected void onPreExecute() {
alertDialog = new AlertDialog.Builder(mcontext).create();
alertDialog.setTitle("Login Information....");
}
@Override
protected String doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
HttpURLConnection client = (HttpURLConnection)url.openConnection();
client.connect();
InputStream inputStream = client.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
content = bufferedReader.readLine();
bufferedReader.close();
inputStream.close();
client.disconnect();
} catch (IOException e) {
error = e.getMessage();
}
return null;
}
@Override
protected void onPostExecute(String unused) {
alertDialog.dismiss();
if (error != null) {
unused=("Output : " + error);
textviews.setText(unused);
} else {
unused=("Output : "+ content);
textviews.setText(unused);
}
}
注意:doInBackground仍然使用“return=null”,因为我只是使用它来读取服务器内部的数据,而不是在任何地方检索数据。您不应该从代码中手动调用
onPostExecute
。对asynctask调用execute
就足够了<代码>onPostExecute将在异步任务完成其工作时自动调用。您不应该从代码中手动调用onPostExecute
。对asynctask调用execute
就足够了<当asynctask完成其工作时,将自动调用code>onPostExecute。您的doInBackground()
方法仅返回null。永远
您的onPostExecute()
方法未被调用,因为它未重写AsyncTask
的onPostExecute()
方法,该方法将采用字符串
参数您的doInBackground()
方法仅返回null。永远
您的
onPostExecute()
方法未被调用,因为它未重写AsyncTask
的onPostExecute()
方法,该方法首先将使用字符串
参数说明活动中的问题:
LongOperation longOperation = new LongOperation(MainActivity.this);
longOperation.execute(serverURL);
longOperation.onPostExecute(uiUpdate);
longOperation.execute(serverURL)
是一种异步方法。这意味着您的程序将调用longOperation.onPostExecute(uiUpdate)代码>在执行方法后立即执行,无需等待doInBackground
中的结果
你不能那样做,也不应该那样做onPostExecute
在doInBackground
返回结果后自动调用(您现在返回null
)
LongOperation LongOperation=新的LongOperation(MainActivity.this);
执行(serverURL);
longOperation.onPostExecute(uiUpdate)
现在,解决方案是:
1) doInBackground
返回类型应始终等于onPostExecute
参数
如果您是返回字符串,则onPostExecute
将如下所示:
protected void onPostExecute(String string) {
}
2) 如何设置活动中的文本视图
。最简单的方法是将活动变量传递给LongOperation
构造函数,并使用该变量访问onPostExecute
中的TextView
3) 如何将数据发送到onPostExecute
?您必须在方法中返回它:
@Override
protected String doInBackground(String... urls) {
// do anything here.
return "String"; //Since return type is String. You can change that you anything and make sure it matches `onPostExecute` parameter type.
}
首先,关于您活动中的问题:
LongOperation longOperation = new LongOperation(MainActivity.this);
longOperation.execute(serverURL);
longOperation.onPostExecute(uiUpdate);
longOperation.execute(serverURL)
是一种异步方法。这意味着您的程序将调用longOperation.onPostExecute(uiUpdate)代码>在执行方法后立即执行,无需等待doInBackground
中的结果
你不能那样做,也不应该那样做onPostExecute
在doInBackground
返回结果后自动调用(您现在返回null
)
LongOperation LongOperation=新的LongOperation(MainActivity.this);
执行(serverURL);
longOperation.onPostExecute(uiUpdate)
现在,解决方案是:
1) doInBackground
返回类型应始终等于onPostExecute
参数
如果您是返回字符串,则onPostExecute
将如下所示:
protected void onPostExecute(String string) {
}
2) 如何设置活动中的文本视图
。最简单的方法是将活动变量传递给LongOperation
构造函数,并使用该变量访问onPostExecute
中的TextView
3) 如何将数据发送到onPostExecute
?您必须在方法中返回它:
@Override
protected String doInBackground(String... urls) {
// do anything here.
return "String"; //Since return type is String. You can change that you anything and make sure it matches `onPostExecute` parameter type.
}
不要打电话给PostExecute自己。当任务完成时,将代表您调用此函数。因为您使doinBackground返回null,所以不要调用onPostExecute。当任务完成时,将代表您调用此函数。由于您使doinBackground也返回null,请在asynctask构造函数中传递uiUpdate textview。这样,当taks的任务完成时,您可以在onpostexecute方法中更新它。是的,但问题是,我正在为TextView检索文本,因此如果我只调用execute,我将只能传递字符串,就像我使用String、Void、String一样。我尝试将TextView转换为字符串,但发生了与之前相同的问题,我将字符串传递给onPostExecute,因此我无法将数据放入TextView并检索到MainActivity。onPostExecute方法首先应该有一个字符串参数,而不是TextView参数。其次,在onPostExecute方法中获得字符串后,可以使用构造函数中传递的textview显示该字符串。此外,还可以在asynctask构造函数中传递uiUpdate textview。这样,当taks的任务完成时,您可以在onpostexecute方法中更新它。是的,但问题是,我正在为TextView检索文本,因此如果我只调用execute,我将只能传递字符串,就像我使用String、Void、String一样。我尝试将TextView转换为字符串,但发生了与之前相同的问题,我将字符串传递给onPostExecute,因此我无法将数据放入TextView并检索到MainActivity。onPostExecute方法首先应该有一个字符串参数,而不是TextView参数。其次,在onPostExecute方法中获取字符串后,可以使用构造函数中传递的textview显示该字符串。那么,如果我传递字符串,我如何将textview检索到MainActivity?那么我如何将textview检索到MainActivity,如果我传递一个字符串?@BerryBerry如果它解决了你的问题,那么你可以接受它作为答案。@BerryBerry如果它解决了你的问题,那么你可以接受它作为答案。