Android的碎片和线程 [英] Android Fragment and thread

查看:187
本文介绍了Android的碎片和线程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用 FragmentActivity 来交换两个标签。这就是标签A和B.选项卡以制表B I正在使用的ListView 与Loadmore按钮,假设loadmore按钮点击时我刚打电话化背景主题。

 私有类loadMoreListView扩展的AsyncTask<太虚,太虚,太虚> {
    @覆盖
    在preExecute保护无效(){
        //发送HTTP请求之前,显示进度对话框
        pDialog =新ProgressDialog(
                getActivity());
        pDialog.setMessage(请稍候...);
        pDialog.setIndeterminate(真);
        pDialog.setCancelable(假);
        pDialog.show();
    }    保护无效doInBackground(虚空......未使用){
        尝试{
            //服务URL fectch数据..
            // xml解析
        }赶上(例外五){
            响应=失败;
            的System.out.println(SEC XML帕兴错误时抛出=+ e)条;
        }        INT currentPosition = listViewattlist.getFirstVisiblePosition();        //追加新数据的ArrayList菜单项
        适配器=新CustomAdapter(getActivity(),R.layout.att_list,R.id.title,数据);
        listViewattlist.setAdapter(适配器);        //设置新的滚动位置
        listViewattlist.setSelectionFromTop(currentPosition + 1,0);
        回报(NULL);
    }    保护无效onPostExecute(虚空未使用){
        //关闭进度对话框
        pDialog.dismiss();
    }
}

当我换,并点击该按钮,我能看到进度条,但它显示如下错误:

  11月7日至十三日:42:29.386:E / AndroidRuntime(894):致命异常:AsyncTask的#2
11月7日至13日:42:29.386:E / AndroidRuntime(894):了java.lang.RuntimeException:执行doInBackground发生错误()
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.os.AsyncTask $ 3.done(AsyncTask.java:299)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在java.util.concurrent.FutureTask中$ Sync.innerSetException(FutureTask.java:273)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在java.util.concurrent.FutureTask.setException(FutureTask.java:124)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:307)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在java.util.concurrent.FutureTask.run(FutureTask.java:137)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:569)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在java.lang.Thread.run(Thread.java:856)
11月7日至13日:42:29.386:E / AndroidRuntime(894):$ android.view.ViewRootImpl CalledFromWrongThreadException:只有创建视图层次可以触摸其观点原来的线程所致。
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4607)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:867)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.view.ViewGroup.invalidateChild(ViewGroup.java:4066)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.view.View.invalidate(View.java:10250)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.view.View.invalidate(View.java:10205)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.widget.ImageView.invalidateDrawable(ImageView.java:190)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:350)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.graphics.drawable.Drawable.setVisible(Drawable.java:546)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.widget.ImageView.onDetachedFromWindow(ImageView.java:1173)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.view.View.dispatchDetachedFromWindow(View.java:11789)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2532)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:3819)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.widget.AbsListView.resetList(AbsListView.java:1936)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.widget.ListView.resetList(ListView.java:502)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.widget.ListView.setAdapter(ListView.java:442)11月7日至13日:42:29.386:E / AndroidRuntime(894):在com.owentech.testswipeab.TabTwo $ loadMoreListView.doInBackground(TabTwo.java:372)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在com.owentech.testswipeab.TabTwo $ loadMoreListView.doInBackground(TabTwo.java:1)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在android.os.AsyncTask $ 2.call(AsyncTask.java:287)
11月7日至13日:42:29.386:E / AndroidRuntime(894):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:305)
11月7日至13日:42:29.386:E / AndroidRuntime(894):... 5个-------------------------------------------------- ----------------------


解决方案

doInBackground()执行其他线程。在 doInBackground()您尝试更新 listViewattlist ,这是在UI线程创建的。这是一个错误,你应该更新 listViewattlist onPostExecute()方法。

I'm using FragmentActivity to swap two tabs. That is tab A and tab B. In Tab B I'm using ListView with Loadmore button, when suppose the loadmore button clicked I just called backgroud thread.

private class loadMoreListView extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        // Showing progress dialog before sending http request
        pDialog = new ProgressDialog (
                getActivity());
        pDialog.setMessage("Please wait..");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    protected Void doInBackground(Void... unused) {
        try {
            //service url to fectch data..
            //xml parsing
        } catch (Exception e) {
            response = "failure";
            System.out.println(" sec XML Pasing Excpetion = " + e);
        }

        int currentPosition = listViewattlist.getFirstVisiblePosition();

        // Appending new data to menuItems ArrayList
        adapter = new CustomAdapter(getActivity(), R.layout.att_list, R.id.title, data);
        listViewattlist.setAdapter(adapter);

        // Setting new scroll position
        listViewattlist.setSelectionFromTop(currentPosition + 1, 0);
        return (null);
    }

    protected void onPostExecute(Void unused) {
        // closing progress dialog
        pDialog.dismiss();
    }
}

When I swap and clicked that button I am able to see the progressbar but it shows the error as below:

07-13 11:42:29.386: E/AndroidRuntime(894): FATAL EXCEPTION: AsyncTask #2
07-13 11:42:29.386: E/AndroidRuntime(894): java.lang.RuntimeException: An error occured while executing doInBackground()
07-13 11:42:29.386: E/AndroidRuntime(894): at android.os.AsyncTask$3.done(AsyncTask.java:299)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.lang.Thread.run(Thread.java:856)
07-13 11:42:29.386: E/AndroidRuntime(894): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4607)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:867)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4066)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.View.invalidate(View.java:10250)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.View.invalidate(View.java:10205)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.ImageView.invalidateDrawable(ImageView.java:190)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:350)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.graphics.drawable.Drawable.setVisible(Drawable.java:546)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.ImageView.onDetachedFromWindow(ImageView.java:1173)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.View.dispatchDetachedFromWindow(View.java:11789)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2532)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:3819)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.AbsListView.resetList(AbsListView.java:1936)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.ListView.resetList(ListView.java:502)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.ListView.setAdapter(ListView.java:442)

07-13 11:42:29.386: E/AndroidRuntime(894): at com.owentech.testswipeab.TabTwo$loadMoreListView.doInBackground(TabTwo.java:372)
07-13 11:42:29.386: E/AndroidRuntime(894): at com.owentech.testswipeab.TabTwo$loadMoreListView.doInBackground(TabTwo.java:1)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-13 11:42:29.386: E/AndroidRuntime(894): ... 5 more

------------------------------------------------------------------------

解决方案

doInBackground() executes in other thread. In doInBackground() you try to update listViewattlist, which was created in the UI-thread. This is a mistake, and you should update listViewattlist in your onPostExecute() method.

这篇关于Android的碎片和线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆