【问题标题】:making the app work for all android versions使应用程序适用于所有 android 版本
【发布时间】:2013-09-24 17:47:53
【问题描述】:

我创建了一个从服务器提取数据的 jsonobject,但它仅适用于小于 3 的 android 版本(旧版本)。让它在所有版本上工作的代码是什么??

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DefaultHttpClient client;
    client = new DefaultHttpClient();
    HttpGet get = new HttpGet("http://saurabhgoyal.comoj.com/json_test.php");
    HttpResponse r;
    try {
        r = client.execute(get);
        HttpEntity e = r.getEntity();
        InputStream is=e.getContent();
        InputStreamReader isr=new InputStreamReader(is);
        BufferedReader reader=new BufferedReader(isr);
        String results=reader.readLine();
        Toast.makeText(this, results, Toast.LENGTH_SHORT).show();
    } catch (ClientProtocolException e1) {
        // TODO Auto-generated catch block
        Toast.makeText(this, "failure", Toast.LENGTH_SHORT).show();
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

【问题讨论】:

  • 您能否提一下在 3+ 版本上运行时究竟发生了什么?任何错误消息或日志都会有所帮助
  • 我在我的牢房里试过它直接崩溃说不幸的是它已经停止工作了。
  • 应用崩溃时请打开Logcat,查找错误日志,如果可能的话粘贴到这里。
  • 在 3.0 及以上版本中使用异步任务。

标签: java android html json apache


【解决方案1】:

您不应该在 UI 线程上进行任何网络调用,您需要使用单独的线程或 AsyncTask 来进行网络调用。

在 3.0 以下的版本中,您可以避免这样做,但在 3.0 中,当您这样做时,您会得到 NetworkOnMainThreadException

【讨论】:

  • ohk .. 你能指导我如何更详细地解决它吗??
  • 您遇到的错误是什么?我猜您正在谈论支持各种版本的应用程序,然后检查您的清单文件您设置的最低和目标 sdk 版本。还在您的代码。
  • 我已经告诉过你,你需要开始一个新的Thread 或使用AsyncTask 很多例子可以通过搜索这个网站甚至android 文档很容易找到
【解决方案2】:

看起来您遇到了 NetworkOnMainThreadException。 您可以尝试使用以下方法关闭严格模式:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

但是,我建议您将任何长时间运行的操作或网络操作移至后台线程,例如 AsyncTask

这里是异步任务

  protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
   new LongOperation().execute();
}

private class LongOperation extends AsyncTask<Void, Void, Void> {
        String results;
      @Override
      protected void doInBackground(String... params) {
                DefaultHttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet("http://saurabhgoyal.comoj.com/json_test.php");
HttpResponse r;
try {
    r = client.execute(get);
    HttpEntity e = r.getEntity();
    InputStream is=e.getContent();
    InputStreamReader isr=new InputStreamReader(is);
    BufferedReader reader=new BufferedReader(isr);
    results=reader.readLine();

} catch (ClientProtocolException e1) {
    // TODO Auto-generated catch block
    Toast.makeText(this, "failure", Toast.LENGTH_SHORT).show();
    e1.printStackTrace();
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
            return "Executed";
      }      

      @Override
      protected void onPostExecute(String result) {
          Toast.makeText(this, results, Toast.LENGTH_SHORT).show();
      }


   }   

希望能解决您的问题。

【讨论】:

    【解决方案3】:

    你的答案在这里Json From Url

    希望对你有帮助。

    如果您喜欢保存然后处理它...您可以使用:

    try {
            InputStream is = getAssets().open("drillData.json");
            int size = is.available();
            byte[] buffer = new byte[size];
            is.read(buffer);
            is.close();
            String str = new String(buffer, "UTF-8");
            JSONArray arr = new JSONArray(str);
    
            for (int i = 0; i < arr.length(); i++) {
                list.add(arr.getJSONObject(i));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
    

    例如来自资产的 json 数组

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      相关资源
      最近更新 更多