Java postTweet方法返回空值

Java postTweet方法返回空值,java,android,json,Java,Android,Json,这是我的代码: PostTweetDialog.java import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle

这是我的代码:

 PostTweetDialog.java

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.codepath.apps.mysimpletweet.models.Tweet;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.JsonHttpResponseHandler;

import org.apache.http.Header;
import org.json.JSONObject;

import java.util.ArrayList;

/**
 * Created by AlecksJohanssen on 4/1/2016.
 */
public class PostTweetDialog extends DialogFragment  {

    private RestClient client;
    private PostTweetInterface dialogFragment;
    ArrayList<Tweet> tweets;
    TweetArrayAdapter adapter;
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View dialogView = inflater.inflate(R.layout.post_tweet, null);
        EditText etComposeTweet = (EditText) dialogView.findViewById(R.id.posttxt);
        final String body = String.valueOf(etComposeTweet.getText());
        tweets = new ArrayList<>();
        adapter = new TweetArrayAdapter(tweets);
        AlertDialog.Builder TweetDialog = new AlertDialog.Builder(getActivity());
        TweetDialog.setTitle("Post Tweet");
        TweetDialog.setView(dialogView)
                .setPositiveButton("Continue", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        client.postTweet(body, new JsonHttpResponseHandler() {

                            @Override
                            public void onSuccess(int statusCode, Header[] headers, JSONObject json) {
                                Tweet myNewTweet = Tweet.fromJSON(json);
                                Log.d("DEBUG",String.valueOf(json.toString()));
                                tweets.add(myNewTweet);
                                adapter.notifyDataSetChanged();

                            }
                            @Override
                            public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
                                Log.d("Error", errorResponse.toString());
                            }

                        });

                    }

                }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int id) {
                dialogFragment.onDialogNegativeClick(PostTweetDialog.this);
            }
        });
        return TweetDialog.create();

    }
post_tweet.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <EditText
        android:id="@+id/posttxt"
        android:inputType="text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="4dp"
        android:hint="Input your Tweet here" />
</LinearLayout>

TimelineActivity.java

public class TimelineActivity extends AppCompatActivity {
    private PostTweetDialog PostDialog = new PostTweetDialog();
    private RestClient client;
    private ArrayList<Tweet> Tweet;
    private TweetArrayAdapter taAdapter;
    private RecyclerView rvItems;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private int[] tabIcons = {
            R.drawable.ic_tab_favourite,
            R.drawable.ic_tab_call,

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timeline);
        rvItems = (RecyclerView) findViewById(R.id.rvItems);
        Tweet = new ArrayList<>();
        taAdapter = new TweetArrayAdapter(Tweet);
        rvItems.setAdapter(taAdapter);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        setupTabIcons();
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        rvItems.setLayoutManager(new LinearLayoutManager(this));
        client = RestApplication.getRestClient();
        populateTimeline(1);
        rvItems.addOnScrollListener(new EndlessRecyclerViewScrollListener(linearLayoutManager) {
            @Override
            public void onLoadMore(int page, int totalItemsCount) {
                populateTimeline(page);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;

    }

    public void doThis(MenuItem item)
    {
        PostDialog.show(getFragmentManager(), "fragment_dialog");
    }

    private void populateTimeline(int page) {
        client.getHomeTimeline(new JsonHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
                Tweet.addAll(com.codepath.apps.mysimpletweet.models.Tweet.fromJSONArray(response));
                int curSize = taAdapter.getItemCount();
                taAdapter.notifyItemRangeInserted(curSize, Tweet.size() - 1);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {
            }
        }, page);
    }

    private void setupTabIcons() {
        tabLayout.getTabAt(0).setIcon(tabIcons[0]);
        tabLayout.getTabAt(1).setIcon(tabIcons[1]);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new OneFragment(), "ONE");
        adapter.addFrag(new TwoFragment(), "TWO");
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFrag(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }


}
公共类TimelineActivity扩展了AppCompative活动{
private PostTweetDialog PostDialog=新建PostTweetDialog();
私人客户;
私人ArrayList推特;
专用TweetArrayAdapter适配器;
私人回收物品;
私人摊位摊位;
私人视页机视页机;
私有int[]选项卡图标={
R.drawable.ic\u tab\u最爱,
R.drawable.ic\u tab\u呼叫,
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_时间线);
rvItems=(RecyclerView)findViewById(R.id.rvItems);
Tweet=newarraylist();
taAdapter=新的TweetArrayAdapter(Tweet);
rvItems.setAdapter(taAdapter);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
viewPager=(viewPager)findViewById(R.id.viewPager);
设置viewPager(viewPager);
tabLayout=(tabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
setupTabIcons();
LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(此);
rvItems.setLayoutManager(新的LinearLayoutManager(本));
client=RestApplication.getRestClient();
人口时间线(1);
rvItems.addOnScrollListener(新的EndlessRecyclerViewScrollListener(linearLayoutManager){
@凌驾
public void onLoadMore(整版页面,整版项目目录){
populateTimeline(第页);
}
});
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(右菜单菜单菜单主菜单);
返回true;
}
公共作废点此(菜单项)
{
show(getFragmentManager(),“fragment_dialog”);
}
私有void populateTimeline(int页){
client.getHomeTimeline(新的JsonHttpResponseHandler(){
@凌驾
成功时的公共void(int statusCode,Header[]headers,JSONArray响应){
addAll(com.codepath.apps.mysimpletweet.models.Tweet.fromJSONArray(响应));
int curSize=taAdapter.getItemCount();
taAdapter.notifyItemRangeInserted(curSize,Tweet.size()-1);
}
@凌驾
public void onFailure(int statusCode,Header[]headers,Throwable Throwable,JSONArray errorResponse){
}
},第页);
}
私有void setupTabIcons(){
tabLayout.getTabAt(0).setIcon(tabIcons[0]);
tabLayout.getTabAt(1).setIcon(tabIcons[1]);
}
专用无效设置ViewPager(ViewPager ViewPager){
ViewPagerAdapter适配器=新的ViewPagerAdapter(getSupportFragmentManager());
addFrag(新的OneFragment(),“一”);
addFrag(新的TwoFragment(),“TWO”);
viewPager.setAdapter(适配器);
}
类ViewPagerAdapter扩展了FragmentPagerAdapter{
私有最终列表MFFragmentList=new ArrayList();
私有最终列表MFFragmentTitleList=new ArrayList();
公共视图页面编辑器(碎片管理器){
高级经理;
}
@凌驾
公共片段getItem(int位置){
返回MFFragmentList.get(位置);
}
@凌驾
public int getCount(){
返回MFFragmentList.size();
}
public void addFrag(片段、字符串标题){
添加(片段);
MFFragmentTitleList.add(标题);
}
@凌驾
公共字符序列getPageTitle(int位置){
返回MFFragmentTitleList.get(位置);
}
}
}
} 我不知道为什么我不能使用我的postTweet方法,它总是返回空值。 这是一个错误的gif

提前谢谢:D。
P/S:这一行的
client.postweet(body,new JsonHttpResponseHandler(){

如注释中所述,您没有在对话类中初始化客户端。您可以更改活动代码以将客户端作为参数传递:

public class TimelineActivity extends AppCompatActivity {
    private PostTweetDialog PostDialog;
    private RestClient client;
    private ArrayList<Tweet> Tweet;
    private TweetArrayAdapter taAdapter;
    private RecyclerView rvItems;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private int[] tabIcons = {
            R.drawable.ic_tab_favourite,
            R.drawable.ic_tab_call,

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timeline);
        rvItems = (RecyclerView) findViewById(R.id.rvItems);
        Tweet = new ArrayList<>();
        taAdapter = new TweetArrayAdapter(Tweet);
        rvItems.setAdapter(taAdapter);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        setupTabIcons();
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        rvItems.setLayoutManager(new LinearLayoutManager(this));
        client = RestApplication.getRestClient();
        PostDialog = new PostTweetDialog(client);

        ...
     }
     ...
 }
然后在
onCreate
中设置一个
onClick
回调,该回调使用该
客户端

        TweetDialog.setView(dialogView)
                .setPositiveButton("Continue", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        client.postTweet(body, new JsonHttpResponseHandler() { ... });
但是,在类
PostTweetDialog
中,我找不到对该变量的赋值。因此,在
PostTweetDialog
中,客户端
始终是未定义的

由于您可能希望使用与活动相同的
RestClient
,因此有几个选项

  • 您可以通过构造函数(如我的原始答案所示)或setter将
    client
    引用传递给对话框类
  • 您可以将活动设置为
    OnClickListener
    ,并在活动中实现
    onClick
    ,该活动已经有
    客户端
    。但是,您需要将活动的引用传递给对话类

  • 如注释中所述,您没有在对话类中初始化客户端。您可以更改活动代码以将客户端作为参数传递:

    public class TimelineActivity extends AppCompatActivity {
        private PostTweetDialog PostDialog;
        private RestClient client;
        private ArrayList<Tweet> Tweet;
        private TweetArrayAdapter taAdapter;
        private RecyclerView rvItems;
        private TabLayout tabLayout;
        private ViewPager viewPager;
        private int[] tabIcons = {
                R.drawable.ic_tab_favourite,
                R.drawable.ic_tab_call,
    
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_timeline);
            rvItems = (RecyclerView) findViewById(R.id.rvItems);
            Tweet = new ArrayList<>();
            taAdapter = new TweetArrayAdapter(Tweet);
            rvItems.setAdapter(taAdapter);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            viewPager = (ViewPager) findViewById(R.id.viewpager);
            setupViewPager(viewPager);
            tabLayout = (TabLayout) findViewById(R.id.tabs);
            tabLayout.setupWithViewPager(viewPager);
            setupTabIcons();
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
            rvItems.setLayoutManager(new LinearLayoutManager(this));
            client = RestApplication.getRestClient();
            PostDialog = new PostTweetDialog(client);
    
            ...
         }
         ...
     }
    
    然后在
    onCreate
    中设置一个
    onClick
    回调,该回调使用该
    客户端

            TweetDialog.setView(dialogView)
                    .setPositiveButton("Continue", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            client.postTweet(body, new JsonHttpResponseHandler() { ... });
    
    但是,在类
    PostTweetDialog
    中,我找不到对该变量的赋值。因此,在
    PostTweetDialog
    中,客户端
    始终是未定义的

    由于您可能希望使用与活动相同的
    RestClient
    ,因此有几个选项

  • 您可以通过构造函数(如图所示)向对话框类传递
    client
    引用
            TweetDialog.setView(dialogView)
                    .setPositiveButton("Continue", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            client.postTweet(body, new JsonHttpResponseHandler() { ... });