Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Android:在线程中从服务器获取数据,并将其传递到UI线程失败_Android_Multithreading_Thread Safety_Resttemplate - Fatal编程技术网

Android:在线程中从服务器获取数据,并将其传递到UI线程失败

Android:在线程中从服务器获取数据,并将其传递到UI线程失败,android,multithreading,thread-safety,resttemplate,Android,Multithreading,Thread Safety,Resttemplate,我正在开发一个Android应用程序,我试图在登录后从服务器上获取数据,但无论我怎么做,我都失败得很惨。请让我知道我在这里做错了什么 错误日志: 07-10 15:24:09.136 4588-4588/com.example.TestLunch E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.example.TestLunch, PID: 4588 java.lang.NullPointerException: p

我正在开发一个Android应用程序,我试图在登录后从服务器上获取数据,但无论我怎么做,我都失败得很惨。请让我知道我在这里做错了什么

错误日志:

07-10 15:24:09.136    4588-4588/com.example.TestLunch E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.TestLunch, PID: 4588
    java.lang.NullPointerException: println needs a message
            at android.util.Log.println_native(Native Method)
            at android.util.Log.d(Log.java:139)
            at com.example.TestLunch.Login.Login$3.onClick(Login.java:104)
以上是因为我正在尝试打印来自服务器的回复

    public class Login extends Activity {

        RestTemplate rest = StaticRestTemplate.getRest();
    protected volatile String reply;

// below code is inside the onCreate method

     Button loginButton = (Button) findViewById(R.id.LoginButton);
            loginButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (!(v == null)) {
                        EditText userEmail = (EditText) findViewById(R.id.usernameText);
                        EditText userPassword = (EditText) findViewById(R.id.PasswordField);
                        if (!(userEmail.getText().toString().isEmpty())) {
                            if (!(userPassword.getText().toString().isEmpty())) {
                                loginUserViaRest(userEmail.getText().toString(), userPassword.getText().toString());
                                Thread thread = new Thread(new Runnable() {
                                    @Override
                                    public void run() {
                                        reply = rest.getForObject(
                                                "http://192.168.178.60:8080/dashboard", String.class);

                                    }
                                });
                                thread.start();
                                ProgressDialog progress = new ProgressDialog(Login.this);
                                progress.setTitle("Loading");
                                progress.setMessage("Wait while loading...");
                                progress.show();
                                while (thread.getState()!=Thread.State.TERMINATED){

                                }
                                progress.dismiss();
    // I get the error at below line.
                                Log.d("Reply is ",reply);

那么,到底出了什么问题。有什么建议吗,谢谢

这很简单。您的回复字符串为空,无法从服务器获得回复。 检查您在清单上的权限,并检查您是否添加了

<uses-permission android:name="android.permission.INTERNET" />


或者不

这很简单。您的回复字符串为空,无法从服务器获得回复。 检查您在清单上的权限,并检查您是否添加了

<uses-permission android:name="android.permission.INTERNET" />


或者不

这很简单。您的回复字符串为空,无法从服务器获得回复。 检查您在清单上的权限,并检查您是否添加了

<uses-permission android:name="android.permission.INTERNET" />


或者不

这很简单。您的回复字符串为空,无法从服务器获得回复。 检查您在清单上的权限,并检查您是否添加了

<uses-permission android:name="android.permission.INTERNET" />


或者不

使用AsyncRestTemplate而不是RestTemplate,使用方法,并像那样附加一个

rest.getForEntity(...).addCallback(...);

使用AsyncRestTemplate而不是RestTemplate,使用方法,并像这样附加一个

rest.getForEntity(...).addCallback(...);

使用AsyncRestTemplate而不是RestTemplate,使用方法,并像这样附加一个

rest.getForEntity(...).addCallback(...);

使用AsyncRestTemplate而不是RestTemplate,使用方法,并像这样附加一个

rest.getForEntity(...).addCallback(...);

这是因为您使用一个线程来分配变量,当您调用时,应答没有得到一个值

 Log.d("Reply is ",reply);

这是因为您使用一个线程来分配变量,当您调用时,应答没有得到一个值

 Log.d("Reply is ",reply);

这是因为您使用一个线程来分配变量,当您调用时,应答没有得到一个值

 Log.d("Reply is ",reply);

这是因为您使用一个线程来分配变量,当您调用时,应答没有得到一个值

 Log.d("Reply is ",reply);


我不知道你为什么使用线程类,使用AsyncTask@mohammadsadeghsaati:如果是异步任务,我是否会在将来的某个点获取数据,我如何检查它。。你能给我写一个符合要求的答案吗?我会并行检查。我不知道你为什么使用线程类,使用AsyncTask@mohammadsadeghsaati:如果是异步任务,我是否会在将来的某个点获取数据,我如何检查它。。你能给我写一个符合要求的答案吗?我会并行检查。我不知道你为什么使用线程类,使用AsyncTask@mohammadsadeghsaati:如果是异步任务,我是否会在将来的某个点获取数据,我如何检查它。。你能给我写一个符合要求的答案吗?我会并行检查。我不知道你为什么使用线程类,使用AsyncTask@mohammadsadeghsaati:如果是异步任务,我是否会在将来的某个点获取数据,我如何检查它。。你能给我写一个符合要求的答案吗?我会同时检查。是的,我在舱单上有。在发送之前,我会在服务器端打印它,所以我知道它就在那里。另外,我知道回复是空的,这就是我试图理解为什么会发生这种情况的原因,即使我正在发送它。如果您已检查有回复,那么rest对象出现问题,您应该检查它,并始终记住对发送字符进行url编码如果您使用GET Method是的,我在清单中有它。在发送之前,我会在服务器端打印它,所以我知道它就在那里。另外,我知道回复是空的,这就是我试图理解为什么会发生这种情况的原因,即使我正在发送它。如果您已检查有回复,那么rest对象出现问题,您应该检查它,并始终记住对发送字符进行url编码如果您使用GET Method是的,我在清单中有它。在发送之前,我会在服务器端打印它,所以我知道它就在那里。另外,我知道回复是空的,这就是我试图理解为什么会发生这种情况的原因,即使我正在发送它。如果您已检查有回复,那么rest对象出现问题,您应该检查它,并始终记住对发送字符进行url编码如果您使用GET Method是的,我在清单中有它。在发送之前,我会在服务器端打印它,所以我知道它就在那里。另外,我知道回复为空,这就是我试图理解为什么会发生这种情况的原因,即使我正在发送它。如果您已检查是否有回复,则rest对象出现问题,你应该检查它,如果你使用GET方法,请始终记住对发送的字符进行url编码。我不确定我的示例是否有效,因为我是根据自己的想法编写的。:)我不确定我的例子是否有效,因为我是凭自己的想法写的。:)我不确定我的例子是否有效,因为我是凭自己的想法写的。:)我不确定我的例子是否有效,因为我是凭自己的想法写的。:)