从 asynctask 在 android 活动中添加小吃吧

Posted

技术标签:

【中文标题】从 asynctask 在 android 活动中添加小吃吧【英文标题】:add snackbar in android activity from asynktask 【发布时间】:2017-10-30 12:56:37 【问题描述】:

main 活动我称之为后台进程。这里在这个背景下有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;
        
    

【问题讨论】:

然后添加,有什么问题? here in this.findViewById(android.R.id.content) 它显示 findViewById 无法解析方法 findViewById(int) 没错,因为 AsyncTask 没有这样的方法。例如,您需要以与使用 Context 相同的方式在构造函数参数中传递 View,并在 Snackbar 中使用它。 你能告诉如何通过吗 background (Context ctx) -> background (Context ctx, View view)。然后将视图存储到一个字段中,并在 Snackbar 中传递:Snackbar.make(view, "Message", Snackbar.LENGTH_LONG).show(); 【参考方案1】:

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

不会工作。 findViewById 是不属于AsyncTask 的活动类方法。

使用接口作为回调。

interface Callback 

public void showSnackBar();

在异步任务中

private Callback callback;

然后

public background (Context ctx)

callback =(Callback) ctx;

然后在onPreExecute中

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

    

在activity类中实现接口和方法

public YourActivity extends AppCompatActivity implements Callback 

然后

@Override
public void showSnackBar()

  // show snack bar in activity

你也可以使用一些事件总线机制来代替上面的。

【讨论】:

【参考方案2】:

您没有传递上下文,使用您的活动在该上下文中查找视图,因为您在异步类中,您无权访问您的活动视图。

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

【讨论】:

MainActivity 不是封闭类 在 ID 为 content 的视图所在的位置使用适当的活动或片段。 我在主要活动和适当的活动中需要它 所以你应该在你的Main活动layout.xml文件中有一个id为content的视图,如果你没有得到它,请在此处添加你的xml代码。【参考方案3】:

显示基本 SnackBar 的代码 sn-p 如下所示:

Snackbar snackbar = Snackbar
        .make(coordinatorLayout, "www.journaldev.com", Snackbar.LENGTH_LONG);
snackbar.show();

在上面的sn -p make()方法中接受三个参数:

coordinatorLayout : 活动的根布局

www.journaldev.com : 这是要在snackbar上显示的消息,我们可以用我们自己的消息自定义它

Snackbar.LENGH_LONG :这是最后一个参数,它是显示小吃条的时间限制

show() 方法用于在屏幕上显示 SnackBar。

这对你有帮助吗?

【讨论】:

这是一个重复的问题。 [这里] (***.com/questions/33206181/…) 我的 gradle 已编译 'com.android.support:design:25.2.0' 现在仍然显示相同 你能试试这个文档androidauthority.com/… 或许它可以帮助你检查失败的地方。 @Raghunandan 的回答似乎也得到了很好的解释。

以上是关于从 asynctask 在 android 活动中添加小吃吧的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量从 AsyncTask 返回到 Android 中的 Google Map 活动

在 Android 的 AsyncTask 期间更改活动是不是被认为是不好的做法?

android 从扩展 AsyncTask 创建一个对象并将其发送到另一个活动

如何从android中的自定义适配器调用Activity asynctask

android asynctask导致另一个活动

android asynctask向ui发送回调[重复]