【问题标题】:How to get data from remote php website in android application如何在android应用程序中从远程php网站获取数据
【发布时间】:2018-08-13 06:22:30
【问题描述】:

我想从 php 远程网站获取数据。我有一个 php 文件,我想通过它在 android 应用程序中导入数据。 我无法获取数据...发生异常错误(只有异常部分正在运行)。我是 android 新手,所以请帮我解决这个问题。我会很感激你。不耐烦地等待帮助。提前致谢。祝好运.... 这是我的代码。

package com.example.androiddevelopers.my;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import android.widget.Toast;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class MainActivity extends AppCompatActivity {

    public class Downloadweb extends AsyncTask<String,Void,String> {

        @Override

        protected String doInBackground(String... params) {
            String data = "";
            URL url ;
            HttpURLConnection urlConnection = null;

            try{

                String postdata = URLEncoder.encode("Player Name","UTF-8")+"=" + URLEncoder.encode(params[1],"UTF-8");
                postdata += URLEncoder.encode("Player Role","UTF-8")+"=" + URLEncoder.encode(params[2],"UTF-8");
                 //url =new URL("http://localhost/ODI-Team/ODI.php");

                url = new URL(params[0]);
                urlConnection = (HttpURLConnection)url.openConnection();
                urlConnection.setDoOutput(true);
                OutputStreamWriter wr = new OutputStreamWriter(urlConnection.getOutputStream());
                wr.write(postdata);
                wr.flush();
                InputStream in = urlConnection.getInputStream();
                InputStreamReader reader = new InputStreamReader(in);
                int ch = reader.read();

                while(ch != -1){

                    char current=(char)ch;
                    data += current;
                    ch=reader.read();
                }
                return  data;
            }
            catch (Exception e){
                //Toast.makeText(MainActivity.this, "error occured"+e.getMessage(), Toast.LENGTH_SHORT).show();
                return "Error ocured"+e.getMessage();
            }

        }
        @Override
        protected void onPostExecute(String s){
            try{
                webView.loadData(s,"text/html","UTF-8");
            }
            catch (Exception e){

                Toast.makeText(MainActivity.this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        }
    }
    WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView=(WebView)findViewById(R.id.webView);

        try{

            Downloadweb downloadweb=new Downloadweb();
            //replace with your own laptop ip address
            downloadweb.execute(new String[]{"http://192.168.0.109/ODI.php"});
        }
        catch (Exception e){

            //Toast.makeText(this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
            webView.loadData("<html><body>Error Occured.</body></html>","text/html","UTF-8");
        }
    }
}

【问题讨论】:

  • 什么是例外,您还想要来自 php 网站或 php webservice 的数据吗?
  • 错误发生 length=1;index=1 这是例外。我在 R 中开发了一个项目,结果保存在 csv 文件中,然后我在 php 文件中得到结果,现在我想要这些结果到 android 应用程序
  • 您可能遇到索引越界异常。当您尝试从 asynctask 数组访问 1 和 2 索引元素时,您只将一个参数传递给您的 asynctask。在你的 url 编码代码中
  • 先生能给我你的邮箱或whatsapp号码吗?
  • 在这里问,我已经帮你了。

标签: java php android android-studio


【解决方案1】:

伙计,protected String doInBackground(String... params) - 此方法在后台线程上执行操作。 String... params - 这是一个带参数的字符串数组,您将把它传递给这个线程。 .execute() - 在这里您正在执行带有传递给后台线程的参数的 asynctask,但只有一个参数 "http://192.168.0.109/ODI.php",但在您的 doInBackground() 方法中,您试图从参数中获取 "Player Name"Player Role,其中不存在。这就是我的意思。

protected String doInBackground(String... params) { // <--- in yor case params contains only 1 element with index 0

    ...

    String postdata = URLEncoder.encode("Player Name", "UTF-8") + "=" + URLEncoder.encode(params[1], "UTF-8"); // here's your second execute params, it's error
    postdata += URLEncoder.encode("Player Role", "UTF-8") + "=" + URLEncoder.encode(params[2], "UTF-8"); // here's your third execute params, it's error

    url = new URL(params[0]); // here's your first execute params
}

在活动中

Downloadweb downloadweb = new Downloadweb();
    //replace with your own laptop ip address
    downloadweb.execute(new String[] {
                    "http://192.168.0.109/ODI.php", // <--- its params[0]
                    "", // <--- here's your missing params[1]
                    "" // <--- here's your missing params[2]
            });

就是这样,为什么您会收到错误消息。
Here's 你有一些文档,如何通过示例使用 asynctask。

@编辑
我正在使用 BufferedReader 从远程服务器获取字符串

BufferedReader rd = new BufferedReader(new InputStreamReader(is));
    String line;
    StringBuilder response = new StringBuilder();
    while ((line = rd.readLine()) != null) {

    response.append(line + '\n');
    }
    rd.close();

    return response.toString();

【讨论】:

  • 兄弟,当我删除参数 1 和 2 时,wr.write(); 中出现错误...所以我应该在括号中写什么
  • 先生,我可以要你的 gmail 或 whatsapp 吗?
  • 我认为这没有任何理由。如果你的代码中包含一些你不想分享的东西,那就创建一些假数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多