java - 从 asynctask 在 android Activity 中添加 snackbar

标签 java android android-activity android-asynctask

main Activity 中,我将此称为后台进程。在此背景下,有一个 onprexecute 方法,在 else 部分中有一个 if else 条件,我需要添加一个 Snackbar >

public class background extends AsyncTask<String,Void,String> {

    private ProgressDialog dialog;
    private ProgressDialog progressDialog;
    private ConnectivityManager cm;
    private String jsonurl, jsonstring;
    public static String listRequest;
    private mobile_form mform;
    private Context ctx;
    ProgressBar progressbar;

    background (Context ctx){
        this.ctx = ctx;
        cm = (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
        dialog = new ProgressDialog(ctx);
        progressbar = new ProgressBar(ctx);
        progressbar.getIndeterminateDrawable().setColorFilter(Color.parseColor("#039BE5"), android.graphics.PorterDuff.Mode.SRC_IN);
        mform = new mobile_form();
    }


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        jsonurl = "https://crackstrickblog.000webhostapp.com/json_get_data.php";
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
        if (isConnected) {
            dialog.setCancelable(false);
            dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
            dialog.show();
            dialog.setContentView(progressbar);
        }
        else {
// here i need to add snackbar like this
//Snackbar.make(this.findViewById(android.R.id.content), "Message", Snackbar.LENGTH_LONG).show();

        }
    }

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

        @Override
        protected void onPostExecute(String result) {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
            if (isConnected) {
                ctx.startActivity(new Intent(ctx, mobile_form.class));
                if (dialog.isShowing())
                    dialog.dismiss();
            }
        }


        @Override
        protected String doInBackground(String... voids) {

            return null;
        }
    }

最佳答案

这个 Snackbar.make(this.findViewById(android.R.id.content), "Message", Snackbar.LENGTH_LONG).show();

不会工作。 findViewById 是 Activity 类的方法,而不是 AsyncTask 的方法。

使用接口(interface)作为回调。

interface Callback {

public void showSnackBar();
}

在异步任务中

private Callback callback;

然后

public background (Context ctx){

callback =(Callback) ctx;

然后在onPreExecute中

 else {
     if(callback!=null)
      callback.showSnackbar();

    }

在 Activity 类中实现接口(interface)和方法

public YourActivity extends AppCompatActivity implements Callback {

然后

@Override
public void showSnackBar()
{
  // show snack bar in activity
}

您还可以使用一些事件总线机制来代替上述机制。

关于java - 从 asynctask 在 android Activity 中添加 snackbar ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44255645/

相关文章:

android - 无法将 Activity 作为方法中的参数传递

java - JScrollPane:Blinker(光标)被边框覆盖

android - 拨出电话无回铃音

java - React-native 构建错误 Android - java.lang.UnsupportedClassVersionError : com/android/build/gradle/AppPlugin : Unsupported major. 次要版本 52.0

Android,多个可搜索 Activity ?

android - 在 Activity 之间滑动

java - 映射 List<DropDown> 中的对象

java - 在存储在 HashMap 中的 ArrayList 中搜索值

Java 热代码替换在静态方法上失败

java - 如何在 android java 中发出相同的 cURL 请求?