2016-04-04 45 views
0

我有一个自定义列表视图,它在我的活动的Oncreate中加载,但在异步任务中加载。我希望在填充列表时使用加载器最初显示活动屏幕。Android Oncreate在AsyncTask中加载列表视图并显示加载程序

活动的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();} 

我的异步任务类

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

我越来越

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 

如何显示与装载机的初始画面???所有的

回答

0

首先要设置一类的情况下未初始化:

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

第二你不用处理在不同的线程的意见。

要解决它,你可以创建一个处理程序将数据发送到uithread:从onpostexecute

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

    } 
} 

并发送数据:

protected void onPostExecute(ArrayList<word> result) { 

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

的处理程序是活动内部的内部类,并且不要忘记在您的活动中创建mContext变量:

private Context mContext = this; 
-1

尝试使用th是intent的getApplicationContext()

asyncLoadWordList task2 = new asyncLoadWordList(this); 
相关问题