簡體   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