Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java onPostExecute从服务器检索空值_Java_Android_Android Asynctask - Fatal编程技术网

Java onPostExecute从服务器检索空值

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

我尝试使用AsyncTask从服务器读取数据,但当我将参数赋给onPostExecute时,它检索到null。MainActivity类:

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如果它解决了你的问题,那么你可以接受它作为答案。