Android AsyncTask 无法从 php-mysql 检索 JSON 字符串

Posted

技术标签:

【中文标题】Android AsyncTask 无法从 php-mysql 检索 JSON 字符串【英文标题】:Android AsyncTask can not retrieve in JSON string from php-mysql 【发布时间】:2016-11-19 08:42:18 【问题描述】:

我可以显示存储在“值”中的数组中的数据,但是当我尝试从数据库中获取数据时,我得到了

"E/Surface: getSlotFromBufferLocked: 未知缓冲区"

错误。我有 php 脚本和 mysql 数据库,其中有一个“问题”列。我不确定在连接建立或 json 解析或其他任何地方是否有问题。

我的 VersionsFragment.java

public class VersionsFragment extends ListFragment 
public VersionsFragment() 



@Override
public void onActivityCreated(Bundle savedInstanceState) 
    super.onActivityCreated(savedInstanceState);
    //String[] versionName = getResources().getStringArray(R.array.version_names); //this works fine
    new MyTask().execute();


class MyTask extends AsyncTask<String, Integer, String[]> 

    @Override
    protected String[] doInBackground(String... params) 
        String[] versionName = new String[0];
        ArrayList<String> scripts = new ArrayList<String>();
        try 
            URL url = new URL("http://192.168.1.105/android/phpcall.php");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            String strJson = "";
            String line;
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            while ((line = br.readLine()) != null) 
                strJson += line;
            
            //Log.d(VersionsFragment.class.getSimpleName(), line);
            JSONArray jArray = new JSONArray(strJson);

            for (int i = 0; i < jArray.length(); i++) 

                JSONObject jObject = jArray.getJSONObject(i);

                String name = jObject.getString("question");

                scripts.add(name);
            
            versionName = scripts.toArray(new String[scripts.size()]);

         catch (MalformedURLException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
         catch (JSONException e) 
            e.printStackTrace();
        
        return versionName;
    

    protected void onPostExecute(String[] result)
        //for(int i=0;i<result.length;i++)
            //Log.d(VersionsFragment.class.getSimpleName(), result[i]);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, result);
        setListAdapter(adapter);
    


@Override
public void onListItemClick(ListView l, View v, int position, long id) 
    OnVersionNameSelectionChangeListener listener = (OnVersionNameSelectionChangeListener) getActivity();
     listener.OnSelectionChanged(position);
   

【问题讨论】:

【参考方案1】:

将上面的代码编辑如下:

JSONObject jsonObj = new JSONObject(strJson);

// Getting JSON Array node
JSONArray jArray = jsonObj.getJSONArray(YOUR_JSON_ARRAY_NAME);

【讨论】:

在 doinbackground 中替换 JSONArray jArray = new JSONArray(strJson);上面的行。 我应该用 strJson 替换 YOUR_JSON_ARRAY_NAME 吗? 你能打印json响应吗? 是的,写 Log.d(VersionsFragment.class.getSimpleName(), "JSON string" + strJson);上面的 JSONObject jsonObj = new JSONObject(strJson);给出以下行:JSON string["id":"1","name":"what is java","address":"programming language","id":"2","name": "什么是oop","address":"面向对象编程","id":"3","name":"为什么使用java?","address":"主要用于android"]跨度> 我已经更改了 php 脚本,现在它检索这个字符串。 JSON 字符串["id":"1","question":"什么是 java","answer":"编程语言","id":"2","question":"什么是 oop" ,"answer":"面向对象编程","id":"3","question":"为什么使用 java?","answer":"主要用于 android"]

以上是关于Android AsyncTask 无法从 php-mysql 检索 JSON 字符串的主要内容,如果未能解决你的问题,请参考以下文章

Android AsyncTask无法运行

如何将变量从 AsyncTask 返回到 Android 中的 Google Map 活动

无法在Asynctask Android,java中调用View

AsyncTask 从 Android R 中弃用。任何替代代码?

用于 android 的 asynctask 使用 php 连接到 mysql

即使 php 代码正在运行,也无法从 MySQL 加载我的数据?