AsyncTask的返回值为null。为什么?

时间:2017-11-18 02:27:01

标签: android android-asynctask

我创建了一个从mysql服务器获取数据的应用程序。只要我需要使用AsyncTask很多次。我创建了一个包含AsyncTask的类,然后,我使用getter方法从我的AsyncTask类中获取结果。 所以,首先,我创建了AsyncTask如下:

public class Get_Contacts_Details extends AsyncTask<Void, Void, Boolean>
{
public String[] Names;
public String[] TheNames ;
private JSONParser jsonParser = new JSONParser();
private Context mContext ;
private JSONObject jsonObjectResult = null;
private String Contact_id ;
private String error;
private String THE_URL ;
public Get_Contacts_Details(String Contact_id, String THE_URL, Context mContext)
{
    super();

    this.Contact_id = Contact_id ;
    this.THE_URL = THE_URL ;
    this.mContext = mContext ;
}


@Override
protected void onPreExecute()
{
    super.onPreExecute();
}

@Override
protected Boolean doInBackground(Void... params)
{
    List<NameValuePair> pairs = new ArrayList<NameValuePair>();
    pairs.add(new BasicNameValuePair("Contact_id","'"+Contact_id+"'"));
    jsonObjectResult = jsonParser.makeHttpRequest(THE_URL, pairs);

    if (jsonObjectResult == null)
    {
        error = "Error in the connection";
        return false;
    }

    try
    {
        if (jsonObjectResult.getInt("success") == 1)
        {
            JSONArray jsonArray = jsonObjectResult.getJSONArray("posts");
            JSONObject news ;
            TheNames = new String[jsonArray.length()];
            for (int i = 0; i < jsonArray.length(); i++)
            {
                news = jsonArray.getJSONObject(i);
                Contacts_ListView listviewcontact  = new Contacts_ListView
                        (
                                news.getString("Names")

                        );

                TheNames[i] = listviewcontact.getContactName();
            }

            return true;
        }
        else
            error = jsonObjectResult.getString("message");

    }
    catch (Exception ex)
    {

    }

    return false;
}

@Override
protected void onPostExecute(Boolean aBoolean)
{
    super.onPostExecute(aBoolean);
    if (!aBoolean)
        Toast.makeText(getmContext(), error, Toast.LENGTH_LONG).show();
    else
    setNames(TheNames);
}


public String[] getNames() {
    return Names;
}

public void setNames(String[] names) {
    Names = names;
}
public Context getmContext() {
    return mContext;
}

}

然后我从另一个班级调用它如下:

public class FilesListActivity extends AppCompatActivity {
private RadioGroup ll ;
private String[] filename;

private String mURL = "Myweb.php";
private String TheNames = "";
private MyFunctionsClass myFunctionsClass;
private Get_Contacts_Details get_contacts_details ;
@Override
public String getText()
{
    String[] my ;
    myFunctionsClass = new MyFunctionsClass();
    int id_Btn = ll.getCheckedRadioButtonId() ;
    selectedRB = (RadioButton) findViewById(id_Btn) ;
    mfile_data = "THE DATA "

    get_contacts_details = new Get_Contacts_Details(
            mfile_data,mURL,FilesListActivity.this);
    get_contacts_details.execute();
        \\ my is always NULL. 

     my = get_contacts_details.getNames();
    for(int i = 0 ; i> my.length;i++)
    {
        TheNames+=my[i]+"\n";
    }
    return TheNames ; 
}

字符串数组my始终为Null。我怎么解决这个问题?

1 个答案:

答案 0 :(得分:1)

Asynctask不能以这种方式工作。 您应该在onPostExecute

之后更新您的UI /逻辑
@Override
protected void onPostExecute(Boolean aBoolean)
{
    super.onPostExecute(aBoolean);
    if (!aBoolean)
        Toast.makeText(getmContext(), error, Toast.LENGTH_LONG).show();
    else
    setNames(TheNames);
//HERE
    String names = "";
    for(int i = 0 ; i> TheNames.length;i++)
    {
        names+=TheNames[i]+"\n";
    }

}

如果您希望将数据返回到您的活动,请使用界面, 请参阅有关AsyncTask的文档: https://developer.android.com/reference/android/os/AsyncTask.html

更新

使用以下代码

创建此接口类:

public interface DataListener {

    void onDataListener (String[] data);
}

修改你的Asynctask类

public class Get_Contacts_Details extends AsyncTask<Void, Void, Boolean>
{
public String[] Names;
public String[] TheNames ;
private JSONParser jsonParser = new JSONParser();
private Context mContext ;
private JSONObject jsonObjectResult = null;
private String Contact_id ;
private String error;
private String THE_URL ;
private DataListener mListener;
public Get_Contacts_Details(String Contact_id, String THE_URL, Context mContext, DataListener mListener)
{
    super();

    this.Contact_id = Contact_id ;
    this.THE_URL = THE_URL ;
    this.mContext = mContext ;
    this.mListener = mListener;
}


@Override
protected void onPreExecute()
{
    super.onPreExecute();
}

@Override
protected Boolean doInBackground(Void... params)
{
    List<NameValuePair> pairs = new ArrayList<NameValuePair>();
    pairs.add(new BasicNameValuePair("Contact_id","'"+Contact_id+"'"));
    jsonObjectResult = jsonParser.makeHttpRequest(THE_URL, pairs);

    if (jsonObjectResult == null)
    {
        error = "Error in the connection";
        return false;
    }

    try
    {
        if (jsonObjectResult.getInt("success") == 1)
        {
            JSONArray jsonArray = jsonObjectResult.getJSONArray("posts");
            JSONObject news ;
            TheNames = new String[jsonArray.length()];
            for (int i = 0; i < jsonArray.length(); i++)
            {
                news = jsonArray.getJSONObject(i);
                Contacts_ListView listviewcontact  = new Contacts_ListView
                        (
                                news.getString("Names")

                        );

                TheNames[i] = listviewcontact.getContactName();
            }

            return true;
        }
        else
            error = jsonObjectResult.getString("message");

    }
    catch (Exception ex)
    {

    }

    return false;
}

@Override
protected void onPostExecute(Boolean aBoolean)
{
    super.onPostExecute(aBoolean);
    if (!aBoolean)
        Toast.makeText(getmContext(), error, Toast.LENGTH_LONG).show();
    else
    setNames(TheNames);

    if (mListener != null){
       mListener.onDataListener(TheNames);
    }
}


public String[] getNames() {
    return Names;
}

public void setNames(String[] names) {
    Names = names;
}
public Context getmContext() {
    return mContext;
}

}

修改您的活动类

public class FilesListActivity extends AppCompatActivity {
private RadioGroup ll ;
private String[] filename;

private String mURL = "Myweb.php";
private String TheNames = "";
private MyFunctionsClass myFunctionsClass;
private Get_Contacts_Details get_contacts_details ;
@Override
public String getText()
{
    String[] my ;
    myFunctionsClass = new MyFunctionsClass();
    int id_Btn = ll.getCheckedRadioButtonId() ;
    selectedRB = (RadioButton) findViewById(id_Btn) ;
    mfile_data = "THE DATA "

    get_contacts_details = new Get_Contacts_Details(
            mfile_data,mURL,FilesListActivity.this, listener);
    get_contacts_details.execute();

    //you can't return TheNames value here

    return TheNames ; 
}


public DataListener listener = new DataListener() {

      @Override
      public void onDataListener (String[] data) {
           for(int i = 0 ; i> data.length;i++)
            {
                TheNames+=data[i]+"\n";
            }

            //now your have the data here, use in your activity, update your UI, etc.


      }
}

}

请记住AsyncTask用于异步任务,不要期望在getText()方法中返回你的数据,btw是谁调用getText()方法?