Android AsyncTask 无法在未调用 Looper.prepare() 的线程内创建处理程序?

标签 android android-asynctask

为什么当我在 asynctask 中使用此代码时出现此错误,即使我正在使用 runOnUiThread() 这是我正在使用的代码(我正在使用 fragment )。

private class GmailXMPP_AfterLogin extends AsyncTask<AfterLogging, Void, Void> {

    private ProgressDialog _dialog;

    @Override
    protected void onPreExecute() {          
        super.onPreExecute();
        _dialog = new ProgressDialog(getActivity());     
        _dialog.setCancelable(false);
        _dialog.setTitle("colors");
        //((ProgressDialog)dialog).setIcon(R.drawable.icon);
        _dialog.setMessage("Your content is loading.. \nPlease wait..");
        _dialog.setIndeterminate(false);         
        _dialog.show();
        //ProgressBar_show();
        Log.i(TAG, " GmailXMPP_AfterLogin onPreExecute" );
    }

    @Override
    protected void onPostExecute(Void feed) {
        //ProgressBar_hide();       
        _dialog.dismiss();
        Log.i(TAG, " GmailXMPP_AfterLogin onPostExecute" );
    }

    @Override
    protected Void doInBackground(AfterLogging... arg0) {

        Log.i(TAG, " GmailXMPP_AfterLogin doInBackground" );
        AfterLogging after = arg0[0];
        final XMPPConnection _connection = after.getConn();
        final String Uname = after.getAcc_Name();

                //synchronized (contactJids) {
        Roster roster = Gtalk_xmpp_client.getRoster();
        String file_name;
        for (RosterEntry entry : roster.getEntries()) {
            if (entry.getType() == ItemType.to || entry.getType() == ItemType.both) {

                boolean yes = Contact_data_source.checkUsername(entry.getUser());
                Log.i(TAG, "Con=" + yes);
                if (!yes) {

                    Bitmap buddy_img = buddyImage(entry, _connection);
                    if (buddy_img != null)
                        file_name = Store(buddy_img);
                    else
                        file_name = "";
                    if (entry.getName() == null)
                        Contact_data_source.createContact( entry.getUser(), entry.getUser(), Uname, file_name, UsedStrings.GoogleAccount );
                    else
                        Contact_data_source.createContact( entry.getName(), entry.getUser(), Uname, file_name, UsedStrings.GoogleAccount );
                } else {
                    Log.i(TAG, "Con=exist");
                }
            }
        }               
        return null;
    }
 }

logcat 显示

12-01 11:59:21.549: E/AndroidRuntime(16595): FATAL EXCEPTION: AsyncTask #1
12-01 11:59:21.549: E/AndroidRuntime(16595): java.lang.RuntimeException: An error occured while executing doInBackground()
12-01 11:59:21.549: E/AndroidRuntime(16595):    at android.os.AsyncTask$3.done(AsyncTask.java:200)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at java.lang.Thread.run(Thread.java:1019)
12-01 11:59:21.549: E/AndroidRuntime(16595): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
12-01 11:59:21.549: E/AndroidRuntime(16595):    at android.os.Handler.<init>(Handler.java:121)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at android.app.Dialog.<init>(Dialog.java:101)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at android.app.AlertDialog.<init>(AlertDialog.java:63)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at android.app.ProgressDialog.<init>(ProgressDialog.java:80)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at android.app.ProgressDialog.<init>(ProgressDialog.java:76)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at com.pipemedia.fragments.ChatAccountsFragment$GmailXMPP_AfterLogin.onPreExecute(ChatAccountsFragment.java:372)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at android.os.AsyncTask.execute(AsyncTask.java:391)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at com.pipemedia.fragments.ChatAccountsFragment.Gtalk_logInComplete(ChatAccountsFragment.java:435)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at com.pipemedia.xmpp.GmailXmppClient.Login(GmailXmppClient.java:60)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at com.pipemedia.fragments.ChatAccountsFragment$GmailXMPP.doInBackground(ChatAccountsFragment.java:337)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at  com.pipemedia.fragments.ChatAccountsFragment$GmailXMPP.doInBackground(ChatAccountsFragment.java:1)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-01 11:59:21.549: E/AndroidRuntime(16595):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
12-01 11:59:21.549: E/AndroidRuntime(16595):    ... 4 more

这是创建错误的行

line 372 : progress_dialog = new ProgressDialog(getActivity());

最佳答案

可能您在后台线程中调用了 AsyncTask.execute()。

只能在UI线程中执行AsyncTask。

关于Android AsyncTask 无法在未调用 Looper.prepare() 的线程内创建处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656765/

相关文章:

android - Google 的应用索引与 Facebook 的应用链接有何不同?

android - 如何在 Android 中每 20 秒调用一次方法

android - 如何从以下示例中实现 AsyncTask?

android - 在 Android 2.2 中使用带有 Activity 的 fragment 时应用程序崩溃

java - RecyclerView 能否与其余 fragment 布局一起滚动?

java - 我们可以使用为Linux编译的 ".so"库到android中吗?

java - 在特定时间切换 FLAG_KEEP_SCREEN_ON

java - 如何使 volley requestqueue 与 Java Android 异步?

java - 从 Activity 中的异步任务获取值(value)

java - IllegalStateException:无法在父级或祖先上下文中找到 android:onClick 属性在 View 类上定义的方法