我有一个包含回收器视图的片段,我将asynctask称为从mysql加载文件到recyClerview,我首先尝试过它的活动,但是当我替换时,通过片段,它不起作用,这是我的文件:
BackownTask.Class
package com.example.harry.recylcerviewdyn;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
/**
* Created by FairDz on 19/04/2017.
*/
public class BackgroundTask extends AsyncTask<Void,Promotion,Void>
{
Context ctx;
Activity activity;
RecyclerView recyclerView;
RecyclerView.Adapter adapter;
RecyclerView.LayoutManager layoutManager;
ArrayList<Promotion> arrayList= new ArrayList<>();
public BackgroundTask(Context ctx)
{
this.ctx = ctx;
activity = (Activity) ctx;
}
String json_string ="http://10.0.2.2/promotion_info/get_promotion_details.php";
@Override
protected void onPreExecute()
{
recyclerView = (RecyclerView)activity.findViewById(R.id.recyclerView);
layoutManager = new LinearLayoutManager(ctx);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
adapter = new RecyclerAdapter(arrayList,ctx);
recyclerView.setAdapter(adapter);
}
@Override
protected Void doInBackground(Void... params) {
try {
URL url = new URL(json_string);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
String line ;
while ((line = bufferedReader.readLine())!= null)
{
stringBuilder.append(line+"n");
}
httpURLConnection.disconnect();
String json_string = stringBuilder.toString().trim();
JSONObject jsonObject = new JSONObject(json_string);
JSONArray jsonArray = jsonObject.getJSONArray("server_response");
int count = 0;
while (count<jsonArray.length())
{
JSONObject JO = jsonArray.getJSONObject(count);
count++;
Promotion promotion = new Promotion(JO.getInt("id"),JO.getString("nom_supermarche"),JO.getString("logo_supermarche"),JO.getString("nom_produit"),JO.getString("logo_produit"),JO.getDouble("prix"),JO.getDouble("promotion_prix"),JO.getString("description"));
publishProgress(promotion);
}
Log.d("JSON STRING",json_string);
}catch (MalformedURLException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null ;
}
@Override
protected void onProgressUpdate(Promotion... values) {
arrayList.add(values[0]);
adapter.notifyDataSetChanged();
}
}
fragment.class
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_test, container, false);
BackgroundTask backgroundTask = new BackgroundTask(getActivity());
backgroundTask.execute();
return view;
}
我在网站上搜索问题,我找到了一些解决方案,这些解决方案在我的项目上不起作用,例如直接在Framgen类中实施异步
当活动
recyclerView = (RecyclerView)activity.findViewById(R.id.recyclerView);
fragment
recyclerView = (RecyclerView)ctx.findViewById(R.id.recyclerView);
好方法
remove 此行activity = (Activity) ctx;
尝试调用 asynctask in ActivityCreated
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
new AsyncTask().execute();
}
backgroundTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
而不是
backgroundTask.execute();
您不应该像这样弄乱它 - asynctask负责在后台执行任务,不要将任何UI widtget依赖项包含在其中 - 当操作花费太长并且活动关闭。
不要在执行后使用回收器视图。尝试使用回调接口将ArrayList返回到活动中,并在不影响您的视图的活动或片段中实现该接口 adapter.notifyDataSetChanged();
。 列表将被刷新并填充新数据。