在异步任务中不调用doinbackground()方法

时间:2017-06-09 04:25:12

标签: android android-asynctask

我正在尝试将帖子从我的应用上传到我的数据库。要在上载过程中显示进度对话框,我正在使用异步任务。不执行doinbackground()方法。 :

private ProgressDialog mProgress;
public void startPosting() {
//uploading posts
}

post.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Task task=new Task();
             if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.HONEYCOMB)
                task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
            else
                task.execute();
        }
    });


}

class Task extends AsyncTask<Void,Void,Void>{

        @Override
        protected void onPreExecute() {
            mProgress = new ProgressDialog(PostActivity.this);

            mProgress.setMessage("Posting Alert");
            mProgress.show();
        }

        @Override
        protected Void doInBackground(Void... voids) {
            try {
                startPosting();
            }catch (Exception e){

            }

            return null;
        }

        @Override
        protected void onProgressUpdate(Void... values) {


        }

        @Override
        protected void onPostExecute(Void aVoid) {
            mProgress.dismiss();
            Toast.makeText(PostActivity.this, "Alert Posted", Toast.LENGTH_LONG).show();


        }
    }


}

感谢任何帮助。 谢谢

6 个答案:

答案 0 :(得分:3)

doInBackground()方法中,您展示了祝酒词。如果要显示吐司,则必须在UI线程上运行。但是doInBackground()方法在不同的线程上运行。

请从那里取出那个吐司。也许你可以做一件事,你可以使用runOnUiThread来展示Toast。

答案 1 :(得分:0)

在您的应用中使用此代码替换您的异步任务类代码。

//=====================================================================================
// Async Task Class
//=====================================================================================

public class LazyDataConnection extends AsyncTask<String, Void, String> {
    String method;

    public LazyDataConnection(String method) {
        this.method = method;
    }

    @Override
    protected String doInBackground(String... arg0) {
        method = arg0[0];
        return getData.callWebService_2(arg0[0], arg0[1]);
    }

    protected void onPostExecute(String xmlResponse) {

        if (xmlResponse.equals("")) {
            try {
                if (progDialog != null && progDialog.isShowing()) {
                    progDialog.dismiss();
                }
            } catch (Exception ex) {
            }
            Toast.makeText(getApplicationContext(), "No Internet Connection", Toast.LENGTH_LONG).show();
        } else if (method.equals("METHOD NAME")) { // method name
            try {
                if (progDialog != null && progDialog.isShowing()) {
                    progDialog.dismiss();
                }
            } catch (Exception ex) {
            }

            METHOD NAME(xmlResponse, "METHOD NAME");
            if (complaint_id != 0) {
                finish();
            }

            Toast.makeText(getApplicationContext(), alertmessage, Toast.LENGTH_LONG).show();

        }
    }

`

如果有任何疑问问我。

答案 2 :(得分:0)

异步任务由在后台线程上运行的计算定义,其结果在UI线程上发布。异步任务由3种泛型类型定义,称为Params,Progress和Result,以及4个步骤,称为onPreExecute,doInBackground,onProgressUpdate和onPostExecute。

您无法更新UI以及在后台线程上执行任何UI操作。在后台线程上调用onPreExecute()

在UI线程上调用

onPostExecute(Result)position:absolute; top:50%; left:50%; transform: translate(-50%,-50%); -webkit-transform: translate(-50%,-50%); -ms-transform: translate(-50%,-50%); -moz-transform: translate(-50%,-50%); 。所以你可以在这里展示吐司。

答案 3 :(得分:0)

你不能直接在doInBackground()中使用上下文,因为它在后台运行而后台线程不能改变UI外观, 您可以在import React, {Component} from "react"; import {StyleSheet, View, AppRegistry, ListView, Text} from "react-native"; class dhrumil extends Component{ constructor(props){ super(props); this.state = { var ds = new ListView.DataSource({rowsHasChanged : (r1,r2) => r1!==r2}) return { dataSource: ds.cloneWithRows(["1","2","3","4","5"]) }; } } _renderer(rowData){ return <Text>{rowData}</Text>; } render(){ return( <ListView dataSource = {() => this.state.dataSource} renderRow = {() => this._renderer()} /> ); } } AppRegistry.registerComponent("dhrumil",()=>dhrumil); onPreExecute()

中制作Toast,而不是这个

如果您在

中遇到错误

onPostExecute(Result)

为此,您还可以使用Toast.makeText(PostActivity.this,"Error while downloading",Toast.LENGTH_LONG).show();方法或创建上下文变量。

getApplicationContext()

答案 4 :(得分:0)

从doInBackground()中移除Toast并将其中的任何一个放入onPostExecute()或在runonUIthread()中运行toast

答案 5 :(得分:0)

onPostExecuted()中的所有内容与runOnUIThread()

结合在一起
runOnUiThread(new Runnable() {
@Override
public void run() {

}});