在处理程序中调用asynctask [英] Call asynctask in handler

查看:98
本文介绍了在处理程序中调用asynctask的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图每1秒在处理程序中调用AsyncTask一次,但我不断收到RuntimeException.有人知道如何解决此问题吗? 下面是我的代码:

I am trying to call AsyncTask inside handler every 1 second but I keep getting RuntimeException.Anybody knows how this could be fixed? Below is my code:

package com.example.whatsapp;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.os.Build;

public class MainActivity extends ActionBarActivity {

    Intent contacts;
    EditText t;
    int counter=0;
    Handler handler = new Handler();
    Runnable runnable = new Runnable() {
        public void run() {
            new AsyncReceiveMessage().execute();
            //afficher();
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        contacts = new Intent(this, ContactsList.class);
        runnable.run();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void afficher()
    {
        counter+=1;
        System.out.println("Hello " +counter);
        handler.postDelayed(runnable, 1000);
    }

    public void registerUser(View view)
    {
        t = (EditText) findViewById(R.id.editText1);
        Button b = (Button) findViewById(R.id.button1);
        b.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(t.getText().length()==11)
                {
                    Toast.makeText(getApplicationContext(), "Done", Toast.LENGTH_LONG).show();
                    contacts.putExtra("deviceNumber", t.getText().toString());
                    startActivity(contacts);
                    new AsyncRegister().execute();
                }
                else
                {
                    Toast.makeText(getApplicationContext(), "Check you number again", Toast.LENGTH_LONG).show();
                }
            }
        });

    }

    private class AsyncRegister extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            t = (EditText) findViewById(R.id.editText1);
            ServerAPI.registerUser(t.getText().toString());
            return "Executed";
        }

        @Override
        protected void onPostExecute(String result) {
        }

        @Override
        protected void onPreExecute() {}

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

    private class AsyncReceiveMessage extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            ServerAPI.receiveMessage(t.getText().toString());
            return "Executed";
        }

        @Override
        protected void onPostExecute(String result) {
        }

        @Override
        protected void onPreExecute() {}

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

}

推荐答案

在以下情况下,您正在使用AsyncTaskdoInBackground方法访问主线程:

You're accessing to the Main thread in doInBackground method of AsyncTask when:

@Override
protected String doInBackground(String... params) {
    ServerAPI.receiveMessage(t.getText().toString());
    return "Executed";
}

如果注释doInBackground中的第一行代码,会收到错误消息吗? 避免这种情况,并尝试在onPreExecute中,在doInBackground中作为params String参数或传递给AsyncTask构造函数来获取这些值.

Do you get the error if you comment the first line of code within doInBackground? Avoid that and try to get those values before in onPreExecute, in doInBackgroundas paramsString parameter, or passing to the AsyncTask constructor.

这篇关于在处理程序中调用asynctask的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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