AsyncTask错误Android App崩溃

时间:2014-02-18 04:01:46

标签: java android json android-asynctask

我的创建代码:

 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 []数组,我是怎么做到的?

4 个答案:

答案 0 :(得分:1)

你在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

在内存中保留其大小

答案 1 :(得分:1)

你需要

 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);
 }

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

答案 2 :(得分:0)

只需在类级别声明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) {}
}

答案 3 :(得分:0)

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

  1. 创建Array对象而不定义它的大小。
  2. 定义为final,不允许您向该对象添加新元素。
  3. 您声明Array null并将其定义为final。当您将Array声明为final时,您无法更改Array。这就是为什么当您要访问Array返回Array值时,无法向null插入新值的原因。这是导致应用程序崩溃的原因。

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

    现在,替换以下行...

    final String[] values = null;
    

    这些......

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