다음 코드에서 어댑터 업데이트를 시도합니다. 코드가 제대로 되었으나 모바일은 홍 모드로 전환됩니다. 데이터가 표시됩니다.
(MainActivity.this).runOnUiThread(new Runnable() {
@Override
public void run() {
for(News news : SharedVar.getCurrentNews()){
_adapter.notifyDataSetChanged();
int currentIndex=news.getIndex();
Log.d("SRC_IMAGE_ADDRESS", news.getImageNewsAddress());
News replaceNews=new News();
News oldNews =_adapter.getItem(currentIndex);
replaceNews.setTitle(oldNews.getTitle()+" ( "+String.valueOf(currentIndex)+" )");
replaceNews.setImageNews(Helpers.GetImageFromUrl(news.getImageNewsAddress()));
SharedVar.getCurrentNews().set(currentIndex, replaceNews);
_adapter.notifyDataSetChanged();
}
}
});
업데이트 :
다음 코드와 같이 코드를 변경했습니다. 홍 모드가 여전히 해결되지 않는데 어떻게 해결하나요?
(MainActivity.this).runOnUiThread(new Runnable() {
@Override
public void run() {
for(News news : SharedVar.getCurrentNews()){
int currentIndex=news.getIndex();
Log.d("SRC_IMAGE_ADDRESS", news.getImageNewsAddress());
News replaceNews=new News();
News oldNews =_adapter.getItem(currentIndex);
replaceNews.setTitle(oldNews.getTitle()+" ( "+String.valueOf(currentIndex)+" )");
replaceNews.setImageNews(Helpers.GetImageFromUrl(news.getImageNewsAddress()));
SharedVar.getCurrentNews().set(currentIndex, replaceNews);
}
_adapter.notifyDataSetChanged();
}
});
업데이트 2 :
public static Bitmap GetImageFromUrl(String url) {
URL urlForImage;
Bitmap imageNews=null;
try {
urlForImage = new URL(url);
URLConnection conn = urlForImage.openConnection();
imageNews= BitmapFactory.decodeStream(conn.getInputStream());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return imageNews;
}
업데이트 3 :
다시 : 다음 코드와 같이 코드를 변경했습니다. 홍 모드는 아직 해결되지 않았습니다.
public class AsyncTaskReadImageNews extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... arg0) {
(MainActivity.this).runOnUiThread(new Runnable() {
@Override
public void run() {
for(News news : SharedVar.getCurrentNews()){
int currentIndex=news.getIndex();
Log.d("INDEX_ITEM", String.valueOf(currentIndex));
News replaceNews=new News();
News oldNews =_adapter.getItem(currentIndex);
replaceNews.setTitle(oldNews.getTitle()+" ( "+String.valueOf(currentIndex)+" )");
replaceNews.setImageNews(Helpers.GetImageFromUrl(news.getImageNewsAddress()));
SharedVar.getCurrentNews().set(currentIndex, replaceNews);
}
}
});
return null;
}
@Override
protected void onPostExecute(Void result) {
_adapter.notifyDataSetChanged();
}
}
}
이것은 내 코드입니다.
public class MainActivity extends Activity {
NewsAdapter _adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
boolean result=true;
int id = item.getItemId();
switch (id) {
case R.id.action_transfer_news:
SharedVar.setCurrentTask(Taskes.GET_TRANSFER_NEWS);
new JsoupCommands().ConnectToWebsite(MainActivity.this);
break;
case R.id.action_settings:
break;
default:
result=super.onOptionsItemSelected(item);
break;
}
return result;
}
public class JsoupCommands {
private Dialog _dialog;
private RatingBar _loadingStar;
public void ConnectToWebsite(Context context) {
_dialog = new Dialog(context);
_dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
_dialog.setContentView(R.layout.loading_layout);
_loadingStar=(RatingBar) _dialog.findViewById(R.id.loading_RatingBar);
Helpers.ConfigRatingLoader(_loadingStar);
new AsyncTaskJsoup().execute();
}
public class AsyncTaskJsoup extends AsyncTask<Void, Void, String>{
boolean _startThread;
Element _NewsRegion;
Elements _links;
List<News> _LisOfNews;
int _step=0;
@Override
protected String doInBackground(Void... listviews) {
String result=null;
Document doc;
try {
threadLoading.start();
SharedVar.clearNews();
doc = Jsoup.connect(Helpers.getCurrentTaskLink()).get();
_NewsRegion = doc.getElementById("content-post");
_links = _NewsRegion.select("article div[class=arch_body]");
_LisOfNews = new ArrayList<News>();
for (Element element : _links) {
Element textNewsElement = element.select("div[class=arch_content] a").first();
Element imageNewsElement = element.select("div[class=arch_img] a img").first();
String imageSrcNews = imageNewsElement.attr("src").trim().replace("../../../..", Helpers.GetCurrentSite());
String titleNews = textNewsElement.text().trim();
String linkNews = textNewsElement.attr("href").trim().replace("../../..", Helpers.GetCurrentSite()+"/persian");
String dateNews=textNewsElement.nextSibling().toString().trim();
News news = new News();
news.setIndex(_LisOfNews.size());
news.setTitle(titleNews);
news.setLink(linkNews);
news.setDate(dateNews);
news.setImageNewsAddress(imageSrcNews);
_LisOfNews.add(news);
}
SharedVar.setCurrentNews(_LisOfNews);
result="Success";
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
Thread threadLoading = new Thread()
{
@Override
public void run() {
try {
while(_startThread) {
Helpers.SetRatingLoad(_loadingStar, _step);
if(_step++==3){
_step=0;
}
Log.d("DELAY", String.valueOf(_step));
sleep(200);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
@Override
protected void onPostExecute(String result) {
_startThread=false;
_dialog.dismiss();
FillNewsinListView();
new AsyncTaskReadImageNews().execute();
}
private void FillNewsinListView() {
List<News> news=SharedVar.getCurrentNews();
if(news!=null&&news.size()>0){
Log.d("FILL_NEWS", "YES");
_adapter = new NewsAdapter(MainActivity.this, R.layout.rows_news, SharedVar.getCurrentNews());
((ListView)findViewById(R.id.news_listView)).setAdapter(_adapter);
}else{
Log.d("FILL_NEWS", "NO");
}
}
@Override
protected void onPreExecute() {
_startThread=true;
_dialog.show();
}
}
public class AsyncTaskReadImageNews extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... arg0) {
(MainActivity.this).runOnUiThread(new Runnable() {
@Override
public void run() {
for(News news : SharedVar.getCurrentNews()){
int currentIndex=news.getIndex();
Log.d("INDEX_ITEM", String.valueOf(currentIndex));
News replaceNews=new News();
News oldNews =_adapter.getItem(currentIndex);
replaceNews.setTitle(oldNews.getTitle()+" ( "+String.valueOf(currentIndex)+" )");
replaceNews.setImageNews(Helpers.GetImageFromUrl(news.getImageNewsAddress()));
SharedVar.getCurrentNews().set(currentIndex, replaceNews);
}
}
});
return null;
}
@Override
protected void onPostExecute(Void result) {
_adapter.notifyDataSetChanged();
}
}
}
}
UI 스레드에서 이미지 다운로드를 수행하기 때문에 앱이 중단됩니다. UI 스레드에서 이미지 다운로드를 수행해야합니다.
내가 좋을 것 것은을 만드는 것입니다 AsyncTask
, 처리 내부의 모든 추가 doInBackground()
방법과 _adapter.notifyDataSetChanged()
내부 onPostExecute()
이것이 당신이 UI 스레드에서 호출 할 필요가있는 유일한 것은이 때문이다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다