2016-04-04 10 views
0

Ich habe eine benutzerdefinierte Listenansicht, die in Oncreate meiner Aktivität aber in Async Task geladen wird. Ich möchte den Aktivitätsbildschirm zunächst mit einem Loader anzeigen, während die Liste ausgefüllt ist.Android Oncreate laden eine Listview in AsyncTask und zeigen Loader

Aktivität OnCreate

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_word); 

    viewFlipper = new ViewFlipper(this); 
    viewFlipper.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 



    TextView txt = (TextView) findViewById(R.id.phraseListHeading); 
    Typeface font = Typeface.createFromAsset(WordActivity.this.getAssets(), "fonts/NotoSans-Regular.ttf"); 

    String categoryName = getIntent().getExtras().getString("categoryName").toUpperCase(); 
    category_obj = (categories) getIntent().getSerializableExtra("category_obj"); 




    asyncLoadWordList task2 = new asyncLoadWordList(getApplicationContext()); 
    task2.execute();} 

Meine Async Task-Klasse

public class asyncLoadWordList extends AsyncTask<ArrayList<word>, Void, ArrayList<word>>{ 

    private Context mContext; 

    public asyncLoadWordList(Context context) { 
     mContext = context; 
    } 


    protected void onPreExecute() { 
     //Start the splash screen dialog 
     if (pleaseWaitDialog == null) 
      pleaseWaitDialog= ProgressDialog.show(WordActivity.this, 
        "PLEASE WAIT", 
        "Getting results...", 
        false); 
    } 

    @Override 
    protected ArrayList<word> doInBackground(ArrayList<word>... params) { 

     wordDb = new wordDB(mContext); 
     category_obj = (categories) getIntent().getSerializableExtra("category_obj"); 
     ArrayList<word> words = new ArrayList<word>(); 
     Cursor row = wordDb.selectWordList(category_obj.getCsvCategoryId().toString()); 
     words.add(new word("-1", "-1", "", "", "", "", "", "", "x.mp3", "")); 
     words.add(new word("-2", "-2", "", "", "", "", "", "", "x.mp3", "")); 
     row.moveToFirst(); 
     while (!row.isAfterLast()) { 
      //Log.d("Data id: ", row.getString(2)); 
      words.add(new word(row.getString(0),row.getString(1),row.getString(2),row.getString(3),row.getString(4),row.getString(5),row.getString(6),row.getString(7),row.getString(8),row.getString(9))); 
      row.moveToNext(); 
     } 
     row.close(); 

     return words; 
    } 
    protected void onPostExecute(ArrayList<word> result) { 

     adapter = new WordAdapter(WordActivity.this, result); 

     ListView listView = (ListView) findViewById(R.id.list_view_word); 
     listView.setAdapter(adapter); 

     if (pleaseWaitDialog != null) { 
      pleaseWaitDialog.dismiss(); 
      pleaseWaitDialog = null; 

     } 

     asyncFlipperView task = new asyncFlipperView(getApplicationContext()); 
     task.execute(new String[]{category_obj.getCsvCategoryId().toString()}); 
    } 
} 

Ich erhalte

04-04 14:10:41.889 31208-31208/thai.phrasi.ctech.com.phrasi E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: thai.phrasi.ctech.com.phrasi, PID: 31208 
java.lang.RuntimeException: Unable to start activity ComponentInfo{thai.phrasi.ctech.com.phrasi/thai.phrasi.ctech.com.phrasi.WordActivity}: android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) 
     at android.app.ActivityThread.startActivityNow(ActivityThread.java:2024) 
     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135) 
     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347) 
     at thai.phrasi.ctech.com.phrasi.CategoryActivity$1.onItemClick(CategoryActivity.java:95) 
     at android.widget.AdapterView.performItemClick(AdapterView.java:299) 
     at android.widget.AbsListView.performItemClick(AbsListView.java:1113) 
     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2911) 
     at android.widget.AbsListView$3.run(AbsListView.java:3645) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5001) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
     at android.view.ViewRootImpl.setView(ViewRootImpl.java:532) 
     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259) 
     at 

Wie kann ich das Einstiegsbild mit Lader ???

Antwort

0

allererst Sie einen Kontext einer Klasse Einstellung, die nicht initialisiert wird:

adapter = new WordAdapter(WordActivity.this, result); 

Zweitens sollten Sie nicht Ansichten in einem anderen Thread manipulieren.

Um es zu lösen Sie einen Handler erstellen könnten die Daten an die uithread zu senden:

public class YourHandler extends Handler { 
    public YourHandler() { 
     super(); 
    } 
    public synchronized void handleMessage(Message msg) { 

     ArrayList<word> data = (ArrayList<word>)msg.obj; 
     adapter = new WordAdapter(mContext, data); 
     ListView listView = (ListView) findViewById(R.id.list_view_word); 
     listView.setAdapter(adapter); 
     listView.notifyDataSetChanged(); 

    } 
} 

und senden die Daten von OnPostExecute:

protected void onPostExecute(ArrayList<word> result) { 

    msg = Message.obtain(); 
    msg.obj = mResponse; 
    mYourHandler.sendMessage(msg); 
    } 

Der Handler ist eine innere Klasse innerhalb der Tätigkeit Vergessen Sie nicht, in Ihrer Aktivität die Variable mContext zu erstellen:

-1

versuchen Sie th zu verwenden ist intead von getApplicationContext()

asyncLoadWordList task2 = new asyncLoadWordList(this); 
Verwandte Themen