【问题标题】:Android : Getting data from server in thread, and passing it to UI thread failingAndroid:在线程中从服务器获取数据,并将其传递给 UI 线程失败
【发布时间】:2015-07-10 13:32:32
【问题描述】:

我正在开发一个 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);

那么,出了什么问题。任何指针,谢谢。

【问题讨论】:

  • 不知道你为什么用Thread类,用AsyncTask
  • @mohammadsadeghsaati :如果它是异步任务,我不会在将来某个时间点获取我的数据,我该如何检查它.. 你能给我写一个适合要求的答案吗,我会检查出来并行。

标签: android multithreading thread-safety resttemplate


【解决方案1】:

使用 AsyncRestTemplate 代替 RestTemplate,使用 getForEntity 方法,并像这样将 ListenableFutureCallback 附加到它;

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

【讨论】:

  • 我不确定我的示例是否有效,因为我是从脑海中写出来的。 :)
【解决方案2】:

这很简单。您的回复字符串为空,您没有收到来自服务器的回复。 检查您对清单的权限并检查您是否已添加

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

还是不

【讨论】:

  • 是的,我在清单中有它。我在发送之前在服务器端打印它,所以我知道它在那里。另外,我知道回复是空的,这就是我试图理解为什么会发生的原因,即使我正在发送它。
  • 如果你检查了192.168.178.60:8080/dashboard有回复,那么rest对象有问题,你应该检查一下
  • 如果您使用 GET 方法,请务必记住对字符进行 url 编码以进行发送
【解决方案3】:

那是因为你使用线程来赋值变量,调用时回复没有得到值

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2015-03-08
    • 1970-01-01
    相关资源
    最近更新 更多