2014-06-22 2 views
0

코드 다음에 Update Adapter를 시도합니다. 코드는 정상적으로 완료되었습니다. 그러나 모바일은 Hong 모드로 전환됩니다. 루프가 끝난 후. 데이터가 표시됩니다.update adapter에 runOnUiThread를 사용하는 방법

(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(); 
         } 

       } 
      }); 

업데이트 :

는 다음 코드처럼 내 코드를 변경했습니다. Hong 모드가 여전히 해결되지 않았습니다. 어떻게 수정합니까?

(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(); 
     } 
    } 
    } 
} 
+0

모든 뉴스 항목에서 "notifyDataSetChanged"를 두 번 호출해야합니까? –

+0

질문 업데이트; –

+0

어떤 오류가 발생합니까? –

답변

1

UI 스레드에서 이미지 다운로드를하고 있기 때문에 앱이 멈 춥니 다. UI 스레드에서 이미지를 다운로드해야합니다. 내가 좋을 것 무엇

AsyncTask을 만들 이것이 당신이 UI 스레드에서 호출 할 필요가 유일한이기 때문에 onPostExecute() 내부의 _adapter.notifyDataSetChanged()doInBackground() 방법 내에서 모든 처리를 추가하는 것입니다.

+0

질문 업데이트. 홍 모드는 여전히 해결되지 않습니다. 왜 ? –

+0

좋아, 홍콩 모드는 무엇입니까? –

+0

또한 AsyncTask 클래스를 추가하고 질문에 어떻게 사용합니까? –

0

변경이이에

(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(); 
        } 
       }); 

설명 : 호출 notifyData SetChanged 여러 번 연속으로, 나쁜 생각입니다. 데이터를 업데이트 한 다음 한 번 호출하십시오!

코드가 모든 뉴스 항목에 대해 코드를 두 번 호출하고있었습니다.

0

귀하의 for 루프에 notifyDataSetChanged() 전화를 걸었습니다. 이는 잘못된 습관이며 귀하는이를 두 번 호출합니다. 따라서 for 루프에서 notifyDataSetChanged()을 제거하십시오. 더 좋은 방법은 코드를 AsyncTask 안에 doInBackground() 안에 넣은 다음 onPostexecute()notifyDataSetChanged()으로 전화하는 것입니다.

관련 문제