0

У меня есть следующий код, я не знаю, почему главная блокировка ui (дождаться завершения DoaJsonReader). Да, я уже прочитал все остальные вопросы, обычно проблема заключается в неправильном использовании метода .get(). Но я не использую его нигде.ASyncTask on MainActivity block UI Layout

Программа работает хорошо, но макет не загружен, он просто показывает пустую активность с заголовком, пока DoaJsonReader выполнил и покажет проблеск (около 0,5 с) макета после завершения ASyncTask.

вот мой код:

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.Toast; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 

public class Loading extends Activity { 
    private Thread thread; 
    DoaData DD; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_loading); 
     DD = new DoaData(this); 
     Toast.makeText(getApplicationContext(), "Loading app resources ...", Toast.LENGTH_LONG).show(); 
     DoaJsonReader jr = new DoaJsonReader(); 
     jr.execute("http://myweb.id/APPS/DOA/?i=index.json"); 
    } 

    private class DoaJsonReader extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... urls) { 
      String response = ""; 
      for (String url : urls) { 
       DefaultHttpClient client = new DefaultHttpClient(); 
       HttpGet httpGet = new HttpGet(url); 
       try { 
        HttpResponse execute = client.execute(httpGet); 
        InputStream content = execute.getEntity().getContent(); 

        BufferedReader buffer = new BufferedReader(
          new InputStreamReader(content)); 
        String s = ""; 
        while ((s = buffer.readLine()) != null) { 
         response += s; 
        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      return response; 
     } 

     @Override 
     protected void onPostExecute(String result) { 

      ArrayList<String> stringArray = new ArrayList<String>(); 
      JSONArray jsonArray = null; 
      JSONObject jsonObject = null; 
      String lastupdate=""; 
      try { 

       //jsonArray = new JSONArray(result); 
       jsonObject= new JSONObject(result); 
       lastupdate=jsonObject.get("lastupdate").toString(); 

       jsonArray=new JSONArray(jsonObject.get("index").toString()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      DD.truncateIndex(); 
      for(int i = 0, count = jsonArray.length(); i< count; i++) 
      { 
       try { 
        jsonObject = jsonArray.getJSONObject(i); 
        DD.insertIndex(jsonObject.getString("title").toString(),jsonObject.getString("file").toString(),jsonObject.getString("tags").toString()); 
       } 
       catch (JSONException e) { 
        e.printStackTrace(); 
       }finally { 
        DD.insertParam("lastupdate",lastupdate); 
       } 
      } 
      finish(); 
     } 
    } 

} 

public class DoaData extends SQLiteOpenHelper { 
    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "DOA.db"; 
    public static final String TABLE_DOA = "DOA_INDEX"; 
    public static final String TABLE_PARAM = "DOA_PARAM"; 

    public DoaData(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS "+TABLE_DOA); 
     db.execSQL("DROP TABLE IF EXISTS "+TABLE_PARAM); 
     onCreate(db); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE "+TABLE_DOA+" (title TEXT,file TEXT, tags TEXT);"); 
     db.execSQL("CREATE TABLE "+TABLE_PARAM+" (key TEXT,value TEXT);"); 
    } 
    public void insertIndex(String title, String file, String tags){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues cv = new ContentValues(); 
     cv.put("title",title); 
     cv.put("file",file); 
     cv.put("tags",tags); 
     db.insert(TABLE_DOA,null,cv); 
     db.close(); // Closing database connection 
    } 
    public List<DoaIndex> getIndexes() { 
     List<DoaIndex> DoaIndexList = new ArrayList<DoaIndex>(); 
     String selectQuery = "Select * From " + TABLE_DOA +";"; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     int i = 0; 
     if (cursor.moveToFirst()) { 
      do { 
       DoaIndex idx = new DoaIndex(i, cursor.getString(0), cursor.getString(1), cursor.getString(2)); 
       // Adding contact to list 
       DoaIndexList.add(idx); 
      } while (cursor.moveToNext()); 
      db.close(); 
     } 
     return DoaIndexList; 
    } 
    public void truncateIndex(){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.execSQL("DELETE FROM "+TABLE_DOA+";"); 
     db.execSQL("VACUUM;"); 
     db.close(); 
    } 
    public void insertParam(String key, String value){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues cv = new ContentValues(); 
     cv.put("key",key); 
     cv.put("value",value); 
     db.insert(TABLE_PARAM, null, cv); 
     db.close(); 
    } 

} 
+0

Вы отлаживаете onPostExecute()? –

+0

Да, я имею, он работает нормально. Что вы хотите узнать? –

+2

почему вы называете финиш(); в onPostExecute()? и что такое DoaData? –

ответ

0

либо удалить DoaJsonReader младший = новый DoaJsonReader(); или непосредственно

jr.execute ("http://myweb.id/APPS/DOA/?i=index.json");

+0

Извините, я редактировал код. У меня есть либо: 'DoaJsonReader jr = new DoaJsonReader(); jr.execute ("http://myweb.id/APPS/DOA/?i=index.json"); ' или ' new DoaJsonReader(). Execute ("http://myweb.id/APPS /DOA/?i=index.json ");' не имеет эффекта –

0

Попробуйте этот путь, надеюсь, что это поможет вам решить вашу проблему.

class DoaJsonReader extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... urls) { 
     String response = ""; 
     for (String url : urls) { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 

       BufferedReader buffer = new BufferedReader(
         new InputStreamReader(content)); 
       String s = ""; 
       while ((s = buffer.readLine()) != null) { 
        response += s; 
       } 

       JSONArray jsonArray = null; 
       JSONObject jsonObject = null; 
       String lastupdate=""; 
       jsonObject= new JSONObject(response); 
       lastupdate=jsonObject.get("lastupdate").toString(); 
       jsonArray=new JSONArray(jsonObject.get("index").toString()); 
       DD.truncateIndex(); 
       for(int i = 0, count = jsonArray.length(); i< count; i++) 
       { 
        try { 
         jsonObject = jsonArray.getJSONObject(i); 
         DD.insertIndex(jsonObject.getString("title").toString(),jsonObject.getString("file").toString(),jsonObject.getString("tags").toString()); 
        } 
        catch (JSONException e) { 
         e.printStackTrace(); 
        }finally { 
         DD.insertParam("lastupdate",lastupdate); 
        } 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return response; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     finish(); 
    } 
} 
+0

Я попробовал, он дал мне ошибку Ошибка: (85, 44) error: Доступна локальная переменная jsonArray изнутри внутреннего класса; должен быть объявлен окончательным ... ' Я перемещаю всю переменную в mainclass и устраняю все ошибки, но это не решает проблему. Могу ли я узнать, почему мы запускаем другую тему внутри ASyncTask? thanks btw –

+0

Итак, переместите переменную JSONArray jsonArray на уровне члена класса, как указано выше onCreate(). –

+0

Пожалуйста, проверьте мои обновленные ан. –

0

РЕШИТЬ: Я endup воссоздать всю деятельность & макет, используя другое имя, а затем переместить все вставки в код базы данных методы doInBackground. Спасибо всем.