【问题标题】:AsyncTask dont show me message from server (HttpUrlConnection)AsyncTask 不向我显示来自服务器的消息 (HttpUrlConnection)
【发布时间】:2015-08-07 17:52:28
【问题描述】:

所以我试图通过 AsyncTask 类中的 HttpURLConnection 从服务器读取消息。问题是,当我发送从服务器读取数据的请求时,它只是一直显示 ProgresssDialog,就像它没有从服务器读取数据一样:

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) {

            String serverURL = "http://192.168.1.1/my/text.php";
            LongOperation longOperation = new LongOperation();
            longOperation.execute(serverURL);


        }
    });



}

private class LongOperation  extends AsyncTask<String, Void, Void> {



    private String content;
    private String error = null;
    private ProgressDialog dialog = new ProgressDialog(MainActivity.this);

    TextView uiUpdate = (TextView) findViewById(R.id.output);

    @Override
    protected void onPreExecute() {
        uiUpdate.setText("Output : ");
        dialog.setMessage("Downloading source..");
        dialog.show();
    }

    @Override
    protected Void 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(Void unused) {
        dialog.dismiss();

        if (error != null) {

            uiUpdate.setText("Output : "+error);

        } else {

            uiUpdate.setText("Output : "+content);

        }
    }

在通过 HttpClient 连接到服务器之前我已经尝试过,所以这不是问题。谢谢!

【问题讨论】:

  • 我在这里发表评论是因为它不是您问题的答案,而是一个建议。使用 Retrofit 进行 web api 调用。它会让您的生活更轻松。
  • 为什么 onPostExecute 参数是点击监听器,但它被定义为 AsyncTask
  • 你也应该在 asyncTask 中使用 @Override 注解。这样你会注意到错误;-)
  • 用 Log 类做一些记录,看看是否调用了 onPostExecute。此外,Java 命名约定是实例以小写字母开头,使用 Dialog 代替 dialog 可能会让其他开发人员感到困惑。
  • @Lucas 的评论显示了问题所在。它永远不会进入您的 onPostExecute() 方法,因为它没有正确覆盖 AsyncTask 的 onPostExecute()。在每个覆盖方法之前添加@Override 是个好主意,这样IDE 会告诉您是否有问题。要修复它,只需将其定义为 onPostExecute(Void unused)

标签: java android


【解决方案1】:

尝试调试它,看看是否调用了 OnPostExecute() 方法!

这似乎卡在您的流阅读器代码中。此外,添加 5-10 秒的连接超时以获得更好的用户体验。!

此外,您的 doInBackground() 方法的返回类型和 OnPostExecute() 方法的输入参数类型似乎存在问题。根据您的 AsyncTask 定义,它们都应该是字符串,不是吗?

【讨论】:

  • 我认为 doInBackground() 方法是读取数据失败的方法,但我已经尝试了所有可能的方法,但我仍然没有得到结果,希望有人知道如何修复它.
【解决方案2】:

See this

尝试删除client.connect();

  try {
            URL url = new URL(urls[0]);
            HttpURLConnection client = (HttpURLConnection)url.openConnection();
            //remove client.connect();

int response = client.getResponse();

if(response == HttpURLConnection.HTTP_OK){
 InputStream inputStream = client.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            content = bufferedReader.readLine();

            bufferedReader.close();
            inputStream.close();
}

    finally{
                client.disconnect();
    }

        } catch (IOException e) {
            error = e.getMessage();
        }

        return null;

确保您的服务器正在运行。还要设置请求超时。

您并不总是需要显式调用 connect 方法来启动连接。依赖于连接的操作,如 getInputStream、getOutputStream 将在必要时隐式执行连接。

这个link

【讨论】:

    【解决方案3】:

    试试这个:

    private class LongOperation  extends                    AsyncTask<String, Void, String>
    {
    private String content;
    private String error = null;
    private ProgressDialog dialog = new        ProgressDialog(MainActivity.this);
    TextView uiUpdate = (TextView)  findViewById(R.id.output);
    @Override
    protected void onPreExecute() {
    uiUpdate.setText("Output : ");
    dialog.setMessage("Downloading source..");
    dialog.show();
    }
    
    @Override
    protected Strinh 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.discon dialog.dismiss();
    } 
    catch (IOException e)
    {
    content = e.getMessage();
    }
    
    return content ;
    }
    @Override
    protected void onPostExecute(String returnValue) {
    
    if (return value != null) {
    
    uiUpdate.setText("Output : "+error);
    } 
    else {
    uiUpdate.setText("Output No Value Returned");
    }
    dialog.dismiss();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 2019-07-02
      • 2020-09-17
      • 1970-01-01
      相关资源
      最近更新 更多