如何在asyncTask dobackground或onPostExecute中显示toast消息

时间:2017-07-29 05:16:09

标签: android android-asynctask

package kr.phpdev.call;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.telephony.PhoneNumberUtils;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;


import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;


public class PhoneStateReceiver extends BroadcastReceiver {
    static String mLastState;
    static final String TAG = "Call Manager";
    final OkHttpClient client = new OkHttpClient();


@Override
public void onReceive(Context context, Intent intent) {

    CallReceivedChk(context, intent);


}

private void CallReceivedChk(Context context, Intent intent) {


    TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

    telephony.listen(new PhoneStateListener() {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            String mState = String.valueOf(state);
            if (mState.equals(mLastState)) { // 두번 호출되는 문제 해결 목적
                return;
            } else {
                mLastState = mState;
            }

            switch (state) {
                case TelephonyManager.CALL_STATE_IDLE:
                    Log.d(TAG, "CALL_IDLE");
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.d(TAG, "CALL_OFFHOOK");
                    break;
                case TelephonyManager.CALL_STATE_RINGING:
                    Log.d(TAG, "CALL_RINGING >>> " + PhoneNumberUtils.formatNumber(incomingNumber));
                    RequestBody formBody = new FormBody.Builder()
                            .add("pn", PhoneNumberUtils.formatNumber(incomingNumber))
                            .build();
                    final Request request = new Request.Builder()
                            .url("http://phpdev.kr/cm/logsend.php")
                            .post(formBody)
                            .build();

                    AsyncTask<String, String, String> asyncTask = new AsyncTask<String, String, String>() {


                        @Override
                        protected void onPreExecute() {

                            super.onPreExecute();

                        }

                        @Override
                        protected String doInBackground(String... params) {
                            try {
                                Response response = client.newCall(request).execute();
                                if (!response.isSuccessful()) {
                                    return null;
                                }
                                return response.body().string();


                            } catch (Exception e) {
                                e.printStackTrace();
                                return null;
                            }
                        }


                        @Override
                        protected void onPostExecute(String s) {
                            super.onPostExecute(s);
                            if (s != "FAILED") {


                                Log.d(TAG, s);
                                Toast.makeText(getApplicationContext(), "토스트메시지입니다.", Toast.LENGTH_SHORT).show();

                            }
                        }

                    };

                    asyncTask.execute();
                    break;
            }
        }
    }, PhoneStateListener.LISTEN_CALL_STATE);
   }

   }

我怎么能得到吐司的消息?

3 个答案:

答案 0 :(得分:0)

使用Toast.makeText(上下文,“토스트메시지입니다。”,Toast.LENGTH_SHORT).show();`

@Override
   protected void onPostExecute(String s) {
      super.onPostExecute(s);
      if (s != "FAILED") {


      Log.d(TAG, s);
      Toast.makeText(context, "토스트메시지입니다.", Toast.LENGTH_SHORT).show();

         }
    }

答案 1 :(得分:0)

您需要在onPostExecute上执行此操作,因为它在UI线程上运行。而且在Java中,字符串比较就像s.equals("Failed")

 @Override
                    protected void onPostExecute(String s) {
                        super.onPostExecute(s);
                        if (!s.equals("FAILED")) {


                            Log.d(TAG, s);
                            Toast.makeText(context, "토스트메시지입니다.", Toast.LENGTH_SHORT).show();

                        }
                    }

答案 2 :(得分:0)

错误:(103,68)错误:从内部类中访问局部变量上下文;需要宣布最终。您只需要使用“context”而不是“getApplicationContext()”。

相关问题