【问题标题】:Android app crashing when trying to call function尝试调用函数时Android应用程序崩溃
【发布时间】:2018-06-07 12:37:58
【问题描述】:

我试图在服务器上使用 php 从 mysql 服务器加载一些数据,它可以工作,但是当我尝试从列表视图中更新数据时,应用程序崩溃了。

这是不工作的代码,当我从 btn onclicklistener 中删除 downloadJSON 时,它工作得非常好,但我真的需要更新按钮才能工作

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn = (Button)findViewById(R.id.button);
        listView = (ListView) findViewById(R.id.listView);
        downloadJSON("http://www.cryptocrea.com/test.php");
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listView.setAdapter(null);
                downloadJSON("http://www.cryptocrea.com/test.php");
            }
        });
    }

这里是完整代码:https://pastebin.com/nWSWXEVJ

【问题讨论】:

  • 你能过去错误信息吗。
  • listView.setAdapter(null); 为什么要将空适配器设置为列表?
  • 我认为你的适配器类有问题。当您在列表视图中设置 null 时,可能会导致崩溃。
  • 正如我们的朋友@Morgan 所说,我认为问题可能是UI 线程中的调用。尝试使用AsyncTasks 或类似的方式拨打电话
  • 你的代码没有错误只要去掉listView.setAdapter(null);这句话。

标签: java php android


【解决方案1】:

您在按钮onClick() 上设置您的适配器null 它使您的适配器在设置列表后null

listView.setAdapter(null);

从按钮点击中删除它,这里你已经设置了适配器

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, stocks);
        listView.setAdapter(arrayAdapter);

【讨论】:

    【解决方案2】:

    你在这段代码中犯了两个错误

    1. 请将“异步”任务放在函数之外,您可以直接调用“异步”任务,而不是调用函数。
    2. 请不要在“异步”任务的“doInBackground”方法中调用 UI 线程方法,请在执行后调用此方法

    【讨论】:

      【解决方案3】:

      你不需要在下面写。

      listView.setAdapter(null);
      

      通过设置 adapter(null) 您的适配器设置 null 值。 使用 set Android Array Adapter 简单项列表

      ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, stocks);
              listView.setAdapter(arrayAdapter);
      

      您可以通过在 onCreate() like 和 onButtonclicklistener 中的 asynctask 中创建构造函数来提高代码效率

       DownloadJSON getJSON = new DownloadJSON(""http://www.cryptocrea.com/test.php"");
              getJSON.execute();
      

      这样写你的代码

      public class MainActivity extends AppCompatActivity {
      
          ListView listView;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              Button btn = (Button)findViewById(R.id.button);
              listView = (ListView) findViewById(R.id.listView);
             DownloadJSON getJSON = new         DownloadJSON(""http://www.cryptocrea.com/test.php"");
              getJSON.execute();
              btn.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
      
              getJSON.execute();
                  }
              });
          }
      
      
      
      
              class DownloadJSON extends AsyncTask<Void, Void, String> {
      
                  @Override
                  protected void onPreExecute() {
                      super.onPreExecute();
                  }
      
      
                  @Override
                  protected void onPostExecute(String s) {
                      super.onPostExecute(s);
                      Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
                      try {
                          loadIntoListView(s);
                      } catch (JSONException e) {
                          e.printStackTrace();
                      }
                  }
      
                  @Override
                  protected String doInBackground(Void... voids) {
                      try {
                          URL url = new URL(urlWebService);
                          HttpURLConnection con = (HttpURLConnection) url.openConnection();
                          StringBuilder sb = new StringBuilder();
                          BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
                          String json;
                          while ((json = bufferedReader.readLine()) != null) {
                              sb.append(json + "\n");
                          }
                          return sb.toString().trim();
                      } catch (Exception e) {
                          return null;
                      }
                  }
              }
      
      
      
          private void loadIntoListView(String json) throws JSONException {
              JSONArray jsonArray = new JSONArray(json);
              String[] stocks = new String[jsonArray.length()];
              for (int i = 0; i < jsonArray.length(); i++) {
                  JSONObject obj = jsonArray.getJSONObject(i);
                  stocks[i] = obj.getString("name") + " " + obj.getString("price");
              }
              ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, stocks);
              listView.setAdapter(arrayAdapter);
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多