繁体   English   中英

AsyncTask错误Android App崩溃

[英]AsyncTask error Android App crashes

我的创建代码:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.board);
    ArrayList<String> passing = new ArrayList<String>();
  new AsyncTaskParseJson().execute();


}

这是我的代码:

public class AsyncTaskParseJson extends AsyncTask<String, String, String> {
    final String TAG = "AsyncTaskParseJson.java";
    String yourJsonStringUrl = "my url here";
    JSONArray dataJsonArr = null;

    @Override
    protected void onPreExecute() {}

    @SuppressWarnings("null")
    @Override
     public String doInBackground(String... arg0) {

        final String[] values = null;
         try {

             // instantiate our json parser
             JsonParser jParser = new JsonParser();

             // get json string from url
             JSONObject json = jParser.getJSONFromUrl(yourJsonStringUrl);

             // get the array of users
             dataJsonArr = json.getJSONArray("response");

             // loop through all users
             for (int i = 1; i < dataJsonArr.length(); i++) {

                 JSONObject c = dataJsonArr.getJSONObject(i);
                 String text = c.getString("text");
                values[i]=text;
             }
          //   ArrayAdapter<String> adapter = new ArrayAdapter<String>(Board.this,R.layout.item, R.id.label, values);
          //   list1.setAdapter(adapter);


         }  
         catch (JSONException e) {
             e.printStackTrace();
         }


         return null;
     }

     @Override
     protected void onPostExecute(String strFromDoInBg) {}



 }

所以,当我像这样评论部分值[i]时,它会启动活动:

      //values[i]=text;

但是当它没有被评论时,app就崩溃了。 我想doInBackground返回String []数组,我是怎么做到的?

你在for循环之前再次声明它

values = new String[dataJsonArr.length()];
for (int i = 1; i < dataJsonArr.length(); i++) {

             JSONObject c = dataJsonArr.getJSONObject(i);
             String text = c.getString("text");
            values[i]=text;
         }

你需要通过声明new来保留其在内存中的大小

你需要拥有

 values = new String[dataJsonArr.length()]; 

另请注意,注释行位于doInbackground 但是你无法从后台线程更新ui。 所以下面应该转到onPostExecute

 //   ArrayAdapter<String> adapter = new ArrayAdapter<String>(Board.this,R.layout.item, R.id.label, values);
 //   list1.setAdapter(adapter);

不使用String数组,最好使用ArrayList<String>

您还需要更改args类型

public class AsyncTaskParseJson extends AsyncTask<String, String, ArrayList<String>> {

然后

 @Override
 public  ArrayList<String> doInBackground(String... arg0) {

    ArrayList<String> values = new ArrayList<String>();
     try {

         // instantiate our json parser
         JsonParser jParser = new JsonParser();

         // get json string from url
         JSONObject json = jParser.getJSONFromUrl(yourJsonStringUrl);

         // get the array of users
         dataJsonArr = json.getJSONArray("response");

         // loop through all users
         for (int i = 1; i < dataJsonArr.length(); i++) {

             JSONObject c = dataJsonArr.getJSONObject(i);
             String text = c.getString("text");
             values.add(text); 
         }
     }  
     catch (JSONException e) {
         e.printStackTrace();
     }

     return values;
 }

然后

 @Override
 protected void onPostExecute(ArrayList<String> result) {
  super.onPostExecute(result);
   ArrayAdapter<String> adapter = new ArrayAdapter<String>(Board.this,R.layout.item, R.id.label, result);
   list1.setAdapter(adapter);
 }

还要确保在setAdapter之前初始化list1 ,因为我没有看到list1初始化的代码。

只需在类级别声明String []数组,如下所示,

private static String[] array = null;


public class AsyncTaskParseJson extends AsyncTask<String, String, String> {
    final String TAG = "AsyncTaskParseJson.java";
    String yourJsonStringUrl = "my url here";
    JSONArray dataJsonArr = null;

    @Override
    protected void onPreExecute() {}

    @SuppressWarnings("null")
    @Override
     public String doInBackground(String... arg0) {

        //  final String[] values = null;          
         try {

             // instantiate our json parser
             JsonParser jParser = new JsonParser();

             // get json string from url
             JSONObject json = jParser.getJSONFromUrl(yourJsonStringUrl);

             // get the array of users
             dataJsonArr = json.getJSONArray("response");

             // loop through all users
             for (int i = 1; i < dataJsonArr.length(); i++) {

                 JSONObject c = dataJsonArr.getJSONObject(i);
                 String text = c.getString("text");
                values[i]=text;
             }
          //   ArrayAdapter<String> adapter = new ArrayAdapter<String>(Board.this,R.layout.item, R.id.label, values);
          //   list1.setAdapter(adapter);


         }  
         catch (JSONException e) {
             e.printStackTrace();
         }


         return null;
     }

     @Override
     protected void onPostExecute(String strFromDoInBg) {}
}

在这里,您正在创建一个带有主要问题的Array对象...

  1. 创建Array对象而不定义它的大小。
  2. 定义为final ,不允许您向该对象添加新元素。

您声明一个为nullArray ,并将其定义为final Array声明为final则无法更改该Array 这就是为什么你不能向该Array插入新值,因此,当你要访问该Array它返回的null值。 这是导致应用程序崩溃的原因。

因此,您需要做的是,使用固定大小定义values数组,而不是将其设置为final 这些将解决您的所有问题。

现在,替换以下行...

final String[] values = null;

用这些...

String[] values;
values = new String[dataJsonArr.length()];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM