从 AsyncTask doInBackground 返回时应用程序崩溃 [重复]

Posted

技术标签:

【中文标题】从 AsyncTask doInBackground 返回时应用程序崩溃 [重复]【英文标题】:App crashing while returning from AsyncTask doInBackground [duplicate] 【发布时间】:2018-12-19 00:32:46 【问题描述】:

[抱歉英语不好]

大家好, 在这里,我尝试在异步任务中执行某些操作,并且应用程序在运行时崩溃。当它到达返回线时,应用程序就会死掉。

这是我的代码

private class MyAsyncTask extends AsyncTask<Void, Void, Void> 
    protected Void doInBackground(Void... params)
        velocidadMedia = (distanciaTotal)/(tiempoTotal);
        track = new TrackItem(  sdf.format(new Date()),
                Double.toString((int) distanciaTotal),
                Double.toString((int) tiempoTotal),
                Double.toString((int) velocidadMedia));
        String IDFromServer = databaseReference.push().getKey();
        track.setKey(IDFromServer);
        databaseReference.child(IDFromServer).setValue(track);
        Toast.makeText(getContext(),"Track Creado!", Toast.LENGTH_LONG).show();
        return null;
    


知道这个异步任务在片段内可能很有用。

Android Studio 在错误日志中给了我这个:

原因:java.lang.RuntimeException: Can't create handler inside 没有调用 Looper.prepare() 的线程

我尝试使用没有说明的onPostExecute 方法,但没有解决问题。

【问题讨论】:

【参考方案1】:

您不能从后台线程调用Toast.makeText()。您只能从 UI/主线程调用。将Toast.makeText() 调用移至onPostExecute()

【讨论】:

将 toast 移动到 onPostExecute 时不起作用。最后将其移至主线程。还是谢谢!【参考方案2】:

来自:Can't create handler inside thread that has not called Looper.prepare()

您从工作线程调用它。您需要从主线程中调用 Toast.makeText()(以及处理 UI 的大多数其他函数)。例如,您可以使用处理程序。

在文档中查找与 UI 线程通信。简而言之:

// Set this up in the UI thread.

mHandler = new Handler(Looper.getMainLooper()) 
    @Override
    public void handleMessage(Message message) 
        // This is where you do your work in the UI thread.
        // Your worker tells you in the message what to do.
    
;

void workerThread() 
    // And this is how you call it from the worker thread:
    Message message = mHandler.obtainMessage(command, parameter);
    message.sendToTarget();

其他选项:

您可以使用AsyncTask,它适用于大多数在后台运行的东西。它有钩子,您可以调用它来指示进度以及完成时间。

您也可以使用Activity.runOnUiThread()

【讨论】:

【参考方案3】:

doInBackground() 中无法显示 toast 消息

Toast.makeText(getContext(),"Track Creado!", Toast.LENGTH_LONG).show();

【讨论】:

以上是关于从 AsyncTask doInBackground 返回时应用程序崩溃 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 IntentService 调用 AsyncTask 的问题

从两个不同的 AsyncTask 更新一个 ListView

使用 AsyncTask 从错误的线程异常调用

Android 从 AsyncTask 调用 notifyDataSetChanged

从Android中的AsyncTask返回一个值[重复]

从 DialogFragment 调用的 AsyncTask 中的 ProgressDialog 未显示