从 activity 上的 intentservice 更新数据

update data from intentservice on an activity

我有一个包含以下代码的 activity,我正在尝试通过创建 class 的实例并调用更新方法来更新 IntentService 中的数据,但它因 null 而崩溃mAdapter 的指针异常。这是将数据从 IntentService 传递到 activity 的正确方法吗?

代码:

public class MainActivity extends Activity {

    RecyclerView  rv;
    SimpleStringRecyclerViewAdapter mAdapter;

    public static final TypedValue mTypedValue = new TypedValue();
    public static int mBackground;
    public static List<String> mValues;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.cheesecake_homepage_fragment_cheese_list);

         rv = (RecyclerView) findViewById(R.id.recyclerview);
        setupRecyclerView(rv);

        send_msg("");
    }

    public void setupRecyclerView(RecyclerView recyclerView) {

        mAdapter = new SimpleStringRecyclerViewAdapter(getBaseContext(),
                getRandomSublist(Cheeses.sCheeseStrings, 3));
        recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
        recyclerView.setAdapter(mAdapter);
    }

    private List<String> getRandomSublist(String[] array, int amount) {
        ArrayList<String> list = new ArrayList<>(amount);
        Random random = new Random();
        while (list.size() < amount) {
            list.add(array[random.nextInt(array.length)]);
        }
        return list;
    }

    public static class SimpleStringRecyclerViewAdapter
            extends RecyclerView.Adapter<SimpleStringRecyclerViewAdapter.ViewHolder> {



        public static class ViewHolder extends RecyclerView.ViewHolder {
            public String mBoundString;

            public final View mView;
            public final ImageView mImageView;
            public final TextView mTextView;

            public ViewHolder(View view) {
                super(view);
                mView = view;
                mImageView = (ImageView) view.findViewById(R.id.avatar);
                mTextView = (TextView) view.findViewById(android.R.id.text1);
            }

            @Override
            public String toString() {
                return super.toString() + " '" + mTextView.getText();
            }
        }

        public String getValueAt(int position) {
            return mValues.get(position);
        }

        public SimpleStringRecyclerViewAdapter(Context context, List<String> items) {
            context.getTheme().resolveAttribute(R.attr.selectableItemBackground, mTypedValue, true);
            mBackground = mTypedValue.resourceId;
            mValues = items;
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.cheesecake_homepage_list_item, parent, false);
            view.setBackgroundResource(mBackground);
            return new ViewHolder(view);
        }

        @Override
        public void onBindViewHolder(final ViewHolder holder, int position) {
            holder.mBoundString = mValues.get(position);
            holder.mTextView.setText(mValues.get(position));

            holder.mView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Context context = v.getContext();
                    /*Intent intent = new Intent(context, CheeseDetailActivity.class);
                    intent.putExtra(CheeseDetailActivity.EXTRA_NAME, holder.mBoundString);

                    context.startActivity(intent);*/
                }
            });

        }

        @Override
        public int getItemCount() {
            return mValues.size();
        }
    }



    public void send_msg( String  set_text){

        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {

                List<String> uu = getRandomSublist(Cheeses.sCheeseStrings, 1);
                mValues.addAll(uu);

                mAdapter.notifyDataSetChanged();



            }
        });


    }

}

意向服务中:

MainActivity test = new MainActivity();
test.send_msg("");

update data from intentservice on an activity

通过创建扩展 Activity 或任何其他主要应用程序组件的 class 对象不是组件之间通信的正确方式。

对于进程内通信(如您的情况,希望将数据从 IntentService 发送到 Activity),请使用 LocalBroadcastManager

您不能像在 Intent 服务代码中那样使用 MainActivity 实例。 有多种方法可以从服务更新 UI,例如 LocalBroadcastReceiversMessengersBoundedService

您可以找到使用 LocalBroadcastManager here

从服务更新 UI 的示例