无法在 AsyncTask 的 onPostExecute 中解析构造函数 ArrayAdapter
Cannot resolve constructor ArrayAdapter in onPostExecute in AsyncTask
我知道这听起来像是一个重复的问题,但我已经尝试了所有的解决方案都没有 works.It 显示错误 "Cannot resolve constructor ArrayAdapter" 我在 Mainactivity 中有列表视图,我已经通过了第二个 activity 我正在搜索远程数据库并在列表视图中显示结果。
看看。。谢谢。。
这是主要的activity:
public class Main2Activity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
private EditText location;
private TextView result ;
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
location = (EditText)findViewById(R.id.editText1);
result = (TextView)findViewById(R.id.textView4);
lv = (ListView) findViewById( R.id.lv );
}
public void search(View view){
String slocation = location.getText().toString();
new SearchActivity(this,lv,1).execute(slocation);
}
搜索活动
public class SearchActivity extends AsyncTask<String,Void,String[]>{
private Context context;
private int byGetOrPost = 0;
private TextView sresult;
ListView lv1;
JSONArray garages;
String[] names;
public SearchActivity(Context context,ListView lv1,int flag) {
this.context = context;
byGetOrPost = flag;
this.lv1 = lv1;
}
protected void onPreExecute(){
}
@Override
protected String[] doInBackground(String... arg0) {
try{
String location = (String)arg0[0];
String link="http://garagekhojo.in/androidtest.php";
String data = URLEncoder.encode("location", "UTF-8") + "=" + URLEncoder.encode(location, "UTF-8");
URL url = new URL(link);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write( data );
wr.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while((line = reader.readLine()) != null)
{
sb.append(line);
break;
}
String newsb = sb.toString();
JSONObject jo = new JSONObject(newsb) ;
garages = jo.getJSONArray("garages");
for (int i = 0; i < garages.length(); i++) {
JSONObject c = garages.getJSONObject(i);
names[i] = c.getString("name");
}
return names;
}
catch(Exception e){
return null;
}
}
@Override
protected void onPostExecute(String[] names){
ArrayAdapter<String> adapter;
adapter = new ArrayAdapter<String>(this, R.layout.class,names);
lv1.setAdapter(adapter);
}
}
请将 activity 的 Context 传递给异步任务并用它代替
adapter = new ArrayAdapter<String>(context, R.layout.class,names);
上下文来自 this.context = context;
永远不要使用 Activity 作为 AsyncTask 的后缀(不好的做法)
(而不是 SearchActivity 使用 SearchAsyncTask)
您必须编辑 SearchActivity.java。首先将其命名为 SearchAsyncTask。你还没有初始化 name[] 字符串数组,这就是它抛出空指针异常的原因。
这里是SearchAsyncTask.java
的代码
public class SearchAsyncTask extends AsyncTask<String,Void,String[]>{
private Context context;
private int byGetOrPost = 0;
private TextView sresult;
ListView lv1;
JSONArray garages;
public SearchActivity(Context context,ListView lv1,int flag) {
this.context = context;
byGetOrPost = flag;
this.lv1 = lv1;
}
protected void onPreExecute(){
}
@Override
protected String[] doInBackground(String... arg0) {
try{
String location = (String)arg0[0];
String link="http://garagekhojo.in/androidtest.php";
String data = URLEncoder.encode("location", "UTF-8") + "=" + URLEncoder.encode(location, "UTF-8");
URL url = new URL(link);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write( data );
wr.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while((line = reader.readLine()) != null)
{
sb.append(line);
break;
}
String newsb = sb.toString();
JSONObject jo = new JSONObject(newsb) ;
garages = jo.getJSONArray("garages");
String[] names = new String[garages.length()];
for (int i = 0; i < garages.length(); i++) {
JSONObject c = garages.getJSONObject(i);
names[i] = c.getString("name");
}
return names;
}
catch(Exception e){
return null;
}
}
@Override
protected void onPostExecute(String[] names){
if(names!=null){
ArrayAdapter<String> adapter;
adapter = new ArrayAdapter<String>(context, R.layout.class,names);
lv1.setAdapter(adapter);
}
}
您也应该应用 null 检查,因为在异常情况下您将返回 null 作为值。因此,如果再次发生任何异常,它就会崩溃。也没有必要定义全局变量 String[] 名称,因为您没有使用该变量。我也编辑了 class 和 class 的名称。请检查。
我知道这听起来像是一个重复的问题,但我已经尝试了所有的解决方案都没有 works.It 显示错误 "Cannot resolve constructor ArrayAdapter" 我在 Mainactivity 中有列表视图,我已经通过了第二个 activity 我正在搜索远程数据库并在列表视图中显示结果。 看看。。谢谢。。 这是主要的activity:
public class Main2Activity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
private EditText location;
private TextView result ;
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
location = (EditText)findViewById(R.id.editText1);
result = (TextView)findViewById(R.id.textView4);
lv = (ListView) findViewById( R.id.lv );
}
public void search(View view){
String slocation = location.getText().toString();
new SearchActivity(this,lv,1).execute(slocation);
}
搜索活动
public class SearchActivity extends AsyncTask<String,Void,String[]>{
private Context context;
private int byGetOrPost = 0;
private TextView sresult;
ListView lv1;
JSONArray garages;
String[] names;
public SearchActivity(Context context,ListView lv1,int flag) {
this.context = context;
byGetOrPost = flag;
this.lv1 = lv1;
}
protected void onPreExecute(){
}
@Override
protected String[] doInBackground(String... arg0) {
try{
String location = (String)arg0[0];
String link="http://garagekhojo.in/androidtest.php";
String data = URLEncoder.encode("location", "UTF-8") + "=" + URLEncoder.encode(location, "UTF-8");
URL url = new URL(link);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write( data );
wr.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while((line = reader.readLine()) != null)
{
sb.append(line);
break;
}
String newsb = sb.toString();
JSONObject jo = new JSONObject(newsb) ;
garages = jo.getJSONArray("garages");
for (int i = 0; i < garages.length(); i++) {
JSONObject c = garages.getJSONObject(i);
names[i] = c.getString("name");
}
return names;
}
catch(Exception e){
return null;
}
}
@Override
protected void onPostExecute(String[] names){
ArrayAdapter<String> adapter;
adapter = new ArrayAdapter<String>(this, R.layout.class,names);
lv1.setAdapter(adapter);
}
}
请将 activity 的 Context 传递给异步任务并用它代替
adapter = new ArrayAdapter<String>(context, R.layout.class,names);
上下文来自 this.context = context;
永远不要使用 Activity 作为 AsyncTask 的后缀(不好的做法) (而不是 SearchActivity 使用 SearchAsyncTask)
您必须编辑 SearchActivity.java。首先将其命名为 SearchAsyncTask。你还没有初始化 name[] 字符串数组,这就是它抛出空指针异常的原因。
这里是SearchAsyncTask.java
的代码public class SearchAsyncTask extends AsyncTask<String,Void,String[]>{
private Context context;
private int byGetOrPost = 0;
private TextView sresult;
ListView lv1;
JSONArray garages;
public SearchActivity(Context context,ListView lv1,int flag) {
this.context = context;
byGetOrPost = flag;
this.lv1 = lv1;
}
protected void onPreExecute(){
}
@Override
protected String[] doInBackground(String... arg0) {
try{
String location = (String)arg0[0];
String link="http://garagekhojo.in/androidtest.php";
String data = URLEncoder.encode("location", "UTF-8") + "=" + URLEncoder.encode(location, "UTF-8");
URL url = new URL(link);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write( data );
wr.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while((line = reader.readLine()) != null)
{
sb.append(line);
break;
}
String newsb = sb.toString();
JSONObject jo = new JSONObject(newsb) ;
garages = jo.getJSONArray("garages");
String[] names = new String[garages.length()];
for (int i = 0; i < garages.length(); i++) {
JSONObject c = garages.getJSONObject(i);
names[i] = c.getString("name");
}
return names;
}
catch(Exception e){
return null;
}
}
@Override
protected void onPostExecute(String[] names){
if(names!=null){
ArrayAdapter<String> adapter;
adapter = new ArrayAdapter<String>(context, R.layout.class,names);
lv1.setAdapter(adapter);
}
}
您也应该应用 null 检查,因为在异常情况下您将返回 null 作为值。因此,如果再次发生任何异常,它就会崩溃。也没有必要定义全局变量 String[] 名称,因为您没有使用该变量。我也编辑了 class 和 class 的名称。请检查。