【问题标题】:Implement Acyntask in fragement在片段中实现 Asynctask
【发布时间】:2014-04-20 22:12:08
【问题描述】:

我是 android 及其编程的新手。我想在 android fragment 中实现 AsyncTask,在这里我想让我的 toast 工作。(用于测试目的)请帮助我并在下面找到我使用的代码。当我试试这个我得到了以下错误

日志猫

 03-15 19:52:25.666: E/AndroidRuntime(18845): FATAL EXCEPTION: AsyncTask #1
    03-15 19:52:25.666: E/AndroidRuntime(18845): java.lang.RuntimeException: An error occured while executing doInBackground()
    03-15 19:52:25.666: E/AndroidRuntime(18845):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
    03-15 19:52:25.666: E/AndroidRuntime(18845):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
    03-15 19:52:25.666: E/AndroidRuntime(18845):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)

我的代码

public class Login extends Fragment   {
        View view;
        ImageView button,pic;

        @SuppressLint("ValidFragment")
        public Login() {

        }
         @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            view= inflater.inflate(R.layout.login, container, false);
                    return view;
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onActivityCreated(savedInstanceState);
            button=(ImageView) view.findViewById(R.id.login);
            pic=(ImageView) view.findViewById(R.id.pic);
            button.setOnClickListener(btnClick);

        }

        ImageView.OnClickListener btnClick=new ImageView.OnClickListener()
        {

            @SuppressWarnings("deprecation")
            @Override
            public void onClick(View v) {

                // my code begins here  
                if(fb.isSessionValid())
                {
                new MyAsyncTask().execute("");  

                }
                else
                {

                }
                        }

        };

        class MyAsyncTask extends AsyncTask<String, String, String>
        {

            @Override
            protected String doInBackground(String... params) {

                    Toast.makeText(getActivity(),"session valid" , Toast.LENGTH_LONG).show(); 

                return null;
            }

        }

    }

【问题讨论】:

    标签: android android-fragments android-asynctask


    【解决方案1】:

    Toast 在 UI 线程中执行,而 doInBackGround() 方法在后台线程中运行。这就是错误的原因。将 Toast 移至 onPostExecute() 方法。 onPostExecute() 方法获取 doInBackGround() 方法的结果,因此对你来说它看起来像:

    @Override
    public void onPostExecute(String result) {
        // make Toast
    }
    

    请记住,必须强制重写 doInBackGround 方法。所以你仍然需要它。

    【讨论】:

      【解决方案2】:

      您不能在后台制作 Toast。将您的 Toast 移动到 onPostExecute() 或像这样在 UI 线程上运行 toast:(第 3 个答案)

      How to raise a toast in AsyncTask, I am prompted to used the Looper

      【讨论】:

      • 为什么我不能在后台运行它?
      • 吐司显示在 UI 上,而不是在后台
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多