【问题标题】:Android Oncreate load a listview in AsyncTask and show loaderAndroid Oncreate 在 AsyncTask 中加载列表视图并显示加载器
【发布时间】:2016-04-04 08:42:52
【问题描述】:

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

Activity 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 android.app.LocalActivityManager$LocalActivityRecord@42169328 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 android.app.LocalActivityManager$LocalActivityRecord@42169328 is not valid; is your activity running?
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:532)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259)
        at 

如何使用加载器显示初始屏幕???

【问题讨论】:

    标签: java android android-asynctask


    【解决方案1】:

    首先,您要设置一个未初始化的类的上下文:

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

    其次,您不应该在不同的线程中操作视图。

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

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

    并从 onpostexecute 发送数据:

       protected void onPostExecute(ArrayList<word> result) {
    
        msg = Message.obtain();
        msg.obj = mResponse;
        mYourHandler.sendMessage(msg);
        }
    

    handler是activity内部的一个内部类,别忘了在activity中创建mContext变量:

    private Context mContext = this;
    

    【讨论】:

      【解决方案2】:

      尝试使用 getApplicationContext() 来代替

      asyncLoadWordList task2 = new asyncLoadWordList(this);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-25
        相关资源
        最近更新 更多